在VB.NET中,我正在为SqlParameterCollection类创建扩展方法,以便我可以在一行代码中添加“详细”参数。我知道.AddWithValue方法将导致SQL Server每次通过SqlCommand调用存储过程时重新评估SQL Server执行计划,其中SqlParameter对象未指定字母数字数据类型的大小(即VarChar或NVarChar)。换句话说,.AddWithValue是个坏主意,除了INT数据类型的类型,其中数据类型的大小是常量。
我之前从未使用过扩展方法,所以这段代码似乎可以实现我的目标吗?代码“有效”,但我正在寻找另一组眼睛,以确保我没有结束将强制重新评估SQL Server执行计划的参数。
编辑:我必须将参数添加到“params”集合中,所以我已经更新了代码。现在它“有效”; - )
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
感谢您的反馈。
答案 0 :(得分:3)
您的扩展程序看起来很好。是否使用Extension方法不会影响SQL Server执行计划的重新评估。
我提出的一个建议是返回SqlParameterCollection而不是void(Sub)。然后可以流畅地添加参数。
而不是
params.AddWithNumericValue(...)
params.AddWithNumericValue(...)
params.AddWithNumericValue(...)
你写的是
params.AddWithNumericValue(...).AddWithNumericValue(...).AddWithNumericValue(...)
这是一种偏好,但有了这样的扩展,我开始欣赏这种风格。