SQL - .NET - SqlParameters - AddWithValue - 未指定Param Type时是否存在任何负面性能影响?

时间:2010-05-13 00:15:09

标签: .net sql

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

我习惯使用add()函数将sql参数添加到sqlCommand。这允许我指定sqlParameter的类型,但它需要另一行来设置值。

使用AddWithValue函数很好,但它会跳过“指定参数类型”步骤。

我猜这会导致参数作为单引号('')中包含的字符串发送,但我不确定。

是这种情况,这会导致存储过程的性能显着降低吗?

注意:我理解通过指定params的数据类型来验证.NET方面的用户数据是很好的 - 我只关心.NET或SQL上的AddWithValue的反射类型开销侧。

2 个答案:

答案 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)