【发布时间】:2017-05-18 21:02:24
【问题描述】:
我有一个需要处理数据并将其存储在 SQL Server 中的 C# 程序。我遇到的问题是一些合法保存的数据包含一个单引号。保存数据时,我需要找到其中包含单引号的项目,并主动将单引号替换为两个单引号,这样我就不会得到截断的字符串。
目前,无论我在哪里添加可能包含单引号的数据,我都会通过以下例程传递它,该例程位于名为 FSQ(修复单引号)的静态模块中,这是例程:
/// <summary>
/// Fix Single Quote - Used to remove Double quotes from strings that would confuse Access database by replacing with Single Quotes.
/// </summary>
/// <param name="s">String text to be fixed by removing double quotes.</param>
/// <returns>The original string with any double-quotes removed and replaced with single quotes. If an error occurs will return an empty string.</returns>
public static string FSQ(string s)
{
string tmp ="";
try
{
if (s == null)
return "";
s = s.Trim();
if (s == "")
return s;
if(s.Contains("'"))
{
if(!s.Contains("''"))//Already been fixed previously so skip here
tmp = s.Replace("'", "''");
s = tmp;
}
return s;
}
catch (Exception ex)
{
PEH("FDQ", "Common Module", ex.Message);
return "";
}
} //public static String FDQ(String s)
这行得通,我的字符串可以正常保存到 SQL,但由于对这个例程有很多调用,所以性能很差,因为程序在处理过程中循环了数千行数据。
是否有更有效的例程可以消除调用此函数的需要?大多数情况下,我只是在构建包含这些项目的更新或插入查询。
任何帮助表示赞赏。
【问题讨论】:
-
啊。
SqlCommand+SqlParamater将通过自动处理转义来解决这个问题,这就是为什么你应该总是使用它们。 -
还要注意如果我设法传入
''',它会跳过执行替换,仍然允许不匹配的引号字符通过。 -
@InnovaITveSolutions 不,这不应该用作重复项,因为 OP 是从 C# 执行的。在这种情况下,在字符串中转义单引号是 SQL 注入的邀请。
-
没有办法修复FSQ,因为这个方法本身就是bug。 不要 试图逃避,只是避免字符串连接,你就不需要引用或任何其他类似的技巧。参数化查询可以传递您想要的任何内容,并且编写起来更简单
-
@Panagiotis Kanavos:你不能被说服留下答案吗?我有点担心其他寻找答案的人看不到你的评论,这比现在的两个要好得多。
标签: c# sql-server string