SQL 构造查询的查询语法错误
SQL query syntax error with constructed query
我在使用此代码时收到错误 "syntax error (missing operator) in query expression":
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 符号中的问题,但我不知道如何使它成为名字 .
使用 \
转义 '
。像这样。
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();
此外,使用 SQL 参数,如@Plutonix 建议的那样,否则你很容易受到 SQL 注入/“Bobby Tables”
你绝对不想通过替换任何特殊字符来实现它,虽然它可能适用于简单的情况,但可能还有其他可能需要处理的保留字符。此外,转义序列是特定于数据库的,因此不同的引擎可能需要不同的处理方式(我假设多数据库只是因为您使用了通用的 OleDb
类 而不是更具体的系列)。
转义特殊字符是脚本和快速脏代码的一个很好的解决方案,但在现实生活中永远不要这样做,因为有更好的选择。
真正的解决方案是参数。您只需发送带有参数占位符而不是实际值的查询文本,然后在 运行ning 之前提供该值。快速实施可能是这样的:
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 允许的,但实际结果会因数据库引擎而异。
我在使用此代码时收到错误 "syntax error (missing operator) in query expression":
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 符号中的问题,但我不知道如何使它成为名字 .
使用 \
转义 '
。像这样。
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();
此外,使用 SQL 参数,如@Plutonix 建议的那样,否则你很容易受到 SQL 注入/“Bobby Tables”
你绝对不想通过替换任何特殊字符来实现它,虽然它可能适用于简单的情况,但可能还有其他可能需要处理的保留字符。此外,转义序列是特定于数据库的,因此不同的引擎可能需要不同的处理方式(我假设多数据库只是因为您使用了通用的 OleDb
类 而不是更具体的系列)。
转义特殊字符是脚本和快速脏代码的一个很好的解决方案,但在现实生活中永远不要这样做,因为有更好的选择。
真正的解决方案是参数。您只需发送带有参数占位符而不是实际值的查询文本,然后在 运行ning 之前提供该值。快速实施可能是这样的:
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 允许的,但实际结果会因数据库引擎而异。