101 lines
2.8 KiB
C#
101 lines
2.8 KiB
C#
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Escapes the string.
|
|
/// </summary>
|
|
/// <param name="value">The string to escape.</param>
|
|
/// <returns>The string with all quotes escaped.</returns>
|
|
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Replaces quotes with double quotes.
|
|
/// </summary>
|
|
/// <param name="value">The string to modidify.</param>
|
|
/// <returns>A string containing double quotes instead of single quotes.</returns>
|
|
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();
|
|
}
|
|
}
|
|
}
|