我有2个样本可以有效地做同样的事情 - 样本1:
command.Parameters.Add(ParamFoo, SqlDbType.Int)
command.Parameters(ParamFoo).Value = fooVal
样本2:
command.Parameters.AddWithValue(ParamBar, barVal)
建议使用哪种样品?我知道第二个样本正在进行一些转换。不要求转换并使用第一个样本不是最好的吗?
答案 0 :(得分:6)
当您发布代码时,完全无关紧要。两种变体的执行方式相同,您无法根据数据库调用的大背景来衡量客户端转换的成本。
但是,当barVal是String类型时,存在一个非常大的已知问题。 SqlClient将参数添加为NVARCHAR类型,当在SQL表达式中与VARCHAR列进行比较时,SQL type precedence rules将要求列转换为NVARCHAR而不是变量为转换为VARCHAR,这改变索引寻求表扫描,并带来灾难性的性能后果。