构造查询的SQL查询语法错误

时间:2015-02-28 01:25:09

标签: c# sql syntax-error

我在查询表达式中遇到错误“语法错误(缺少运算符)”使用此代码:

x = "John's";
OleDbCommand commandRdd = new OleDbCommand("Select rdd_tbl.Customer, rdd_tbl.Balance From rdd_tbl WHERE rdd_tbl.Customer ='" + x + "'", con);
OleDbDataReader readerRdd = commandRdd.ExecuteReader();

我知道 John>'中的问题< s 符号,但我不知道如何将其作为名称的一部分。

2 个答案:

答案 0 :(得分:2)

使用'逃脱\。像这样。

x = "John\'s";
OleDbCommand commandRdd = new OleDbCommand("Select rdd_tbl.Customer, rdd_tbl.Balance From rdd_tbl WHERE rdd_tbl.Customer ='" + x + "'", con);
OleDbDataReader readerRdd = commandRdd.ExecuteReader();

另外,使用像@Plutonix这样的SQL参数建议,否则你很容易受到SQL注入/" Bobby Tables"

enter image description here

答案 1 :(得分:2)

你真的不想通过替换任何特殊字符来做到这一点,而它可能适用于简单的情况,可能有其他可能需要处理的保留字符。此外,转义序列是特定于DB的,因此不同的引擎可能需要不同的处理(我假设多DB的原因只是因为您使用了通用的OleDb类而不是更具体的系列)。

转义特殊字符对于脚本和快速而脏的代码来说是一个很好的解决方案,但在现实生活中从不这样做,因为有更好的选择。

真正的解决方案是参数。您只需使用参数占位符而不是实际值发送查询文本,然后在运行之前提供值。快速实现可能是这样的:

x = "John's";
OleDbCommand commandRdd = new OleDbCommand("Select rdd_tbl.Customer, rdd_tbl.Balance From rdd_tbl WHERE rdd_tbl.Customer = @customer", con);
commandRdd.Parameters.Add(new OleDbParameter("@customer", OleDbType.VarChar, 100, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Default, x));
OleDbDataReader readerRdd = commandRdd.ExecuteReader();

要注意的一些事情。首先,查询文本包含rdd_tbl.Customer = @customer,这是一个独立于您要提交的实际值的固定文本。然后是参数声明,其中指定了名称,数据类型和实际值。请务必填写所有这些细节,并将它们与基础数据库结构相匹配。其余代码完全相同。

这还有提高性能的额外好处。由于查询文本完全相同,如果再次提交,查询通常可以缓存并重新使用,即使参数值发生更改(这些值查询本身的一部分)。如果您需要连续几次使用不同的值运行相同的查询,则可以使用预处理语句,这也是随后使用不同值运行的预编译查询。 API允许这些可能的优化,但实际结果将根据数据库引擎而有所不同。