Files
zszq-trs/YLErpDAL/Helpers/SqlHelper.cs
2024-05-09 14:06:26 +08:00

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();
}
}
}