using System.Text; namespace YLErp.Helpers { static class SqlHelper { enum CharClass : byte { None, Quote, Backslash } private const string stringOfBackslashChars = "\u005c\u00a5\u0160\u20a9\u2216\ufe68\uff3c"; private const string stringOfQuoteChars = "\u0022\u0027\u0060\u00b4\u02b9\u02ba\u02bb\u02bc\u02c8\u02ca\u02cb\u02d9\u0300\u0301\u2018\u2019\u201a\u2032\u2035\u275b\u275c\uff07"; private static CharClass[] charClassArray; static SqlHelper() { charClassArray = MakeCharClassArray(); } private static CharClass[] MakeCharClassArray() { CharClass[] a = new CharClass[65536]; foreach (char c in stringOfBackslashChars) { a[c] = CharClass.Backslash; } foreach (char c in stringOfQuoteChars) { a[c] = CharClass.Quote; } return a; } private static bool NeedsQuoting(string s) { return s.Any(c => charClassArray[c] != CharClass.None); } /// /// Escapes the string. /// /// The string to escape. /// The string with all quotes escaped. public static string EscapeString(string value) { if (!NeedsQuoting(value)) { return value; } StringBuilder sb = new StringBuilder(); foreach (char c in value) { CharClass charClass = charClassArray[c]; if (charClass != CharClass.None) { sb.Append("\\"); } sb.Append(c); } return sb.ToString(); } /// /// Replaces quotes with double quotes. /// /// The string to modidify. /// A string containing double quotes instead of single quotes. public static string DoubleQuoteString(string value) { if (!NeedsQuoting(value)) { return value; } StringBuilder sb = new StringBuilder(); foreach (char c in value) { CharClass charClass = charClassArray[c]; if (charClass == CharClass.Quote) { sb.Append(c); } else if (charClass == CharClass.Backslash) { sb.Append("\\"); } sb.Append(c); } return sb.ToString(); } } }