0

我正在使用一个绑定到访问数据库的 C# 表单应用程序。该数据库的一部分不在我的控制范围内,特别是包含带有字符串", ),和其他此类字符的部分。不用说,这会混淆一些查询,因为我需要使用该列来选择其他数据。这只是一个桌面表单应用程序,问题在于导出器功能,因此无需担心 SQL 注入或其他此类事情。当我使用可能包含引号并将其与 Access 数据库中存储的内容匹配的变量时,如何告诉这个东西在查询中忽略引号等?

好吧,一个例子是我从一行中提取了几列。其中之一可能是这样的:

大(3-1/16" 直径)

你明白了。引号打破了查询。我目前正在使用 OleDb 挖掘数据库,直到现在都没有问题。如果可以得到帮助,我宁愿不要对我目前所做的事情感到厌烦,至少在我准备好进行适当的重构之前不要这样做。

4

4 回答 4

3

这实际上并没有你看到的那么大的问题:只是不要通过将 SQL 查询构建为纯字符串来处理它们。使用 SqlCommand 类并使用查询参数。这样,SQL 引擎将为您正确地转义所有内容,因为它会知道要直接读取的代码是什么,以及要转义的参数值是什么。

于 2012-08-14T00:19:43.327 回答
3

您正在尝试防范 SQL 注入攻击;请参阅https://www.owasp.org/index.php/SQL_Injection

防止这些攻击的最简单方法是使用查询参数;http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

var cmd = new SqlCommand("select * from someTable where id = @id");
cmd.Parameters.Add("@id", SqlDbType.Int).Value = theID;
于 2012-08-14T02:46:15.033 回答
0

至少对于单引号,添加另一个引号似乎有效:''变成'.

即使注入不应该成为问题,我仍然会考虑使用parameters。归根结底,它们是更简单的选择,因为它们避免了许多不可预见的问题,注射只是其中之一。

于 2012-08-14T00:18:13.373 回答
0

因此,当我阅读您的问题时,您正在将查询构建为 C# 中的字符串,连接已查询的列值,结果字符串要么不再是 C# 中的字符串,要么与访问数据库中的内容不匹配.

如果问题出在 C# 中,我想您将需要某种转义函数,例如

stringvar += escaped(columnvalue)
...
private static void escaped(string cv) as string {
  //code to put \ in front of problem characters in cv
}

如果问题在于访问,那么

'逃脱'“逃脱”

&您可以在'...'中放置一个包含“”的列值,它应该可以工作。

但是我真正的想法是,您尝试运行的 SQL 可能会更好地重组以使用子查询来获取匹配的值,然后您只需将列名与列名进行比较。

如果您发布更多关于您正在生成的查询的信息,以及表结构的一些提示,我会尝试进一步提供帮助 - 或者其他人一定能够给您一些建设性的东西(尽管您可能需要根据 Jet SQL 语法对其进行调整)

于 2012-08-14T05:22:36.760 回答