【发布时间】:2019-11-20 08:46:00
【问题描述】:
我正在尝试将参数传递给查询,但使用引号作为字符串值。 但我似乎可以让它工作。 我在这里做错了什么。
SqlConnection conn = new SqlConnection(SERP_FT_connection);
SqlCommand cmd = new SqlCommand("SELECT sp.* "
+ " FROM [serp_post] sp "
+ " LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id "
+ " WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = @paymentTerm ", conn);
cmd.CommandType = CommandType.Text;
conn.Open();
SqlParameter param = new SqlParameter();
param.ParameterName = "@paymentTerm";
param.Value = paymentTerm; // when debugged here it shows as "CH1"
cmd.Parameters.Add(param);
调试时查询是这样的,
SELECT sp.* FROM [serp_post] sp LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = @paymentTerm
最后查询应该看起来像这个带引号传递的值
SELECT sp.* FROM [serp_post] sp LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = 'CH1'
【问题讨论】:
-
SQL 参数不只是像这样插入到查询中 - 它们被传递作为参数到数据库。不管调试时是什么样子,执行查询时会发生什么?这对我来说基本上是正确的......
-
代码运行正常。让它按照您期望的方式运行的唯一方法是在查询中使用字符串替换,而不是参数。
-
是的。熟悉数据库的 Profiler 工具也是明智之举。一旦您开始变得更高级并使用 ORM 框架,事情变得更加不透明,您将感谢我们。
-
@TabAlleman 谢谢我在查询中替换了它而不是将其解析为参数并且它正在工作。
-
@NPras 是的,谢谢你的建议,我确实开始使用分析器工具,并且更容易调试 sql 查询。
标签: c# sql sql-server parameters parameter-passing