2011-01-18 46 views
0

在VB.NET中,我为SqlParameterCollection类创建了扩展方法,以便我可以在一行代码中添加“详细”参数。我知道.AddWithValue方法将导致SQL Server在每次通过SqlCommand调用存储过程时使用SqlParameter对象(不指定字母数字数据类型的大小)(即VarChar或NVarChar)来重新评估SQL Server执行计划。换句话说,除了数据类型的大小是常量的INT数据类型之外,.AddWithValue是一个坏主意。做这些扩展方法看起来正确吗?

我从来没有使用过扩展方法,所以这个代码似乎完成我想要的?代码“有效”,但我正在寻找另一组眼睛,以确保我没有结束会强制重新评估SQL Server执行计划的参数。

编辑:我不得不实际添加参数到“参数”集合,所以我更新了代码。现在, “作品” ;-)

Imports System.Runtime.CompilerServices 

Public Module AdoParameterExtensions 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub AddWithNumericValue(ByVal params As System.Data.SqlClient.SqlParameterCollection, ByVal parameterName As String, ByVal parameterType As SqlDbType, ByVal value As Object) 

     Dim newParam As New System.Data.SqlClient.SqlParameter 

     With newParam 

      .ParameterName = parameterName 
      .SqlDbType = parameterType 
      .Value = value 

     End With 

     params.Add(newParam) 

    End Sub 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub AddWithStringValue(ByVal params As System.Data.SqlClient.SqlParameterCollection, ByVal parameterName As String, ByVal parameterType As SqlDbType, ByVal size As Integer, ByVal value As Object) 

     Dim newParam As New System.Data.SqlClient.SqlParameter 

     With newParam 

      .ParameterName = parameterName 
      .SqlDbType = parameterType 
      .Size = size 
      .Value = value 

     End With 

     params.Add(newParam) 

    End Sub 

End Module 

感谢您的反馈。

回答

3

你的扩展看起来很好。使用扩展方法不会影响SQL Server执行计划是否被重新评估。

我会做的一个建议是返回SqlParameterCollection而不是void(Sub)。然后可以流利地添加参数。

而不是

params.AddWithNumericValue(...) 
params.AddWithNumericValue(...) 
params.AddWithNumericValue(...) 

你写的

params.AddWithNumericValue(...).AddWithNumericValue(...).AddWithNumericValue(...) 

这是一个偏好,但像这样的扩展我来欣赏的风格。

相关问题