经常写数据访问层的时候,会写这些代码:
string sql = @"UPDATE dbo.Table1
SET ProductID = @ProductID ,
YearNum = @YearNum ,
Batch = @newBatch
WHERE BatchID = @originalBatch ";
SqlParameter[] parameters = { new SqlParameter("@ProductID", productID),
new SqlParameter("@YearNum", year),
new SqlParameter("@newBatch", newBatch),
new SqlParameter("@originalBatch", originalBatch) };
代码中的 year 是DateTime类的,newBatch是字符串的,
如果不用 SqlParameter的话, 手写sql语句的时候,都要给 日期和字符串加上 ' ' 两个冒号,如:
string sql = @"UPDATE dbo.Table1
SET YearNum = '2015-01-01'; ,
Batch = 'a2015b1'
我很好奇想知道, SqlCommand 是怎么根据SqlParameter去生产一段完整的sql命令的
------解决思路----------------------
参数化查询并不去拼接什么字符串,而是直接传给数据库系统。相应的数据库系统,都支持参数化查询,只是调用语法稍有不同(例如 t-sql 语言中有 sp_executesql 等等好几种写法),而 ado.net 并没有什么“生产一段完整的sql命令的”的功能。
------解决思路----------------------
ado.net并不是去拼凑什么“完整的sql命令”,因此对于一些数据库系统,[email protected] ? 号用来作为参数,到底只支持一种还是两种都支持,到底有没有对参数提交顺序有要求”等等问题。这些都是因为 ado.net 根本不揪扯这些所谓参数的实现,因此每一种数据库就都有自己的“标准”需要你遵守。
------解决思路----------------------
它并不解析,在数据库执行的时候,[email protected][]对应的值
至于可以直接执行,这个是SQL SERVER自己的特性
你拿Profile监控一下执行的语句就知道了