我习惯使用add()函数将sql参数添加到sqlCommand。这允许我指定sqlParameter的类型,但它需要另一行来设置值。
使用AddWithValue函数很好,但它会跳过“指定参数类型”步骤。
我猜这会导致参数作为单引号('')中包含的字符串发送,但我不确定。
是这种情况,这会导致存储过程的性能显着降低吗?
注意:我理解通过指定params的数据类型来验证.NET方面的用户数据是很好的 - 我只关心.NET或SQL上的AddWithValue的反射类型开销侧。
答案 0 :(得分:6)
类型扣除发生在客户端。在SqlParameter
内,它基本上有一个位开关语句来确定您指定的值对应的SQL类型。因此发送到SQL Server的内容没有区别,但确定.NET类型对应的SQL类型的开销非常小。在宏观方案中,性能成本甚至不会显示为数据库调用实际花费的时间。
在指定SQL类型时,您仍然可以在一行中执行此操作:
cmd.Parameters.Add("@something", SqlDbType.NVarChar).Value = someString;
答案 1 :(得分:0)
Dean的方法效果很好,但我觉得它看起来有点奇怪。这是一种扩展方法,您可以使用该方法来重载AddWithValue
以接收SqlDbType
,以便您可以将函数调用转换为一行:
<Extension()>
Public Function AddWithValue(ByVal sqlParameterCollection As SqlParameterCollection,
ByVal parameterName As String,
ByVal value As Object,
ByVal sqlDbType As SqlDbType) As SqlParameter
sqlParameterCollection.Add(parameterName, sqlDbType)
sqlParameterCollection(parameterName).Value = value
Return sqlParameterCollection(parameterName)
End Function
然后这样称呼:
cmd.Parameters.AddWithValue("@entity_uid", clientId, SqlDbType.Int)