是否可以为SqlParameter实现加宽运算符

本文关键字:运算符 实现 SqlParameter 是否 | 更新日期: 2023-09-27 18:29:26

取以下类:

Public Class DocumentNumber
    Private m_DOC_NUMBER As Integer = 0
    Public Sub New(ByVal DOC_NUMBER As Integer)
        m_DOC_NUMBER = DOC_NUMBER
    End Sub
    Public Sub New(ByVal DEPOT_CODE As String)
        Dim ParseInput As Integer = 0
        If Integer.TryParse(DEPOT_CODE, ParseInput) = False Then
            m_DOC_NUMBER = 0
        Else
            m_DOC_NUMBER = ParseInput
        End If
    End Sub
    ''' <summary>
    ''' Returns the DOC_NUMBER as a zero-padded number, eg: 0000028374
    ''' </summary>
    Public Overrides Function ToString() As String
        Return Right("0000000000" & m_DOC_NUMBER.ToString(), 10)
    End Function
    ''' <summary>
    ''' Returns the DOC_NUMBER as an integer, use .ToString() zero-padded version.
    ''' </summary>
    Public Function ToInteger() As Integer
        Return m_DOC_NUMBER
    End Function
    ''' <summary>
    ''' Ensure that the DOC_NUMBER object has an implicit convert if assigned to an integer / string
    ''' </summary>
    Public Shared Widening Operator CType(ByVal d As DocumentNumber) As Integer
        Return d.ToInteger()
    End Operator
    Public Shared Widening Operator CType(ByVal d As DocumentNumber) As String
        Return d.ToString()
    End Operator
End Class

这个类允许我从字符串或整数中声明DocID:

Dim DocumentID As New DOC_NUMBER("00123")
Dim DocumentID As New DOC_NUMBER(123)

并且可以通过调用CCD_ 1&ToString():

Dim NewDocumentID as Integer = DocumentID.ToInteger()
Dim NewDocumentID as String = DocumentID.ToString()

请注意,两个Widening Operator也允许隐式转换,这意味着当将此类的实例分配给整数或字符串时,可以省略.ToInteger().ToString(),例如:

Dim NewDocumentID as Integer = DocumentID
Dim NewDocumentID as String = DocumentID

到目前为止;这一切都很好,我的下一个挑战是在分配给SqlParameter()对象时添加隐式转换。

正如你所知,如果你把一个对象分配给一个新的SqlParameter(),数据类型可以省略,SqlParameter()对象会自动解决这个问题——然而,如果我用我的对象尝试这个,它显然失败了:

m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber))

这会产生以下错误(可以理解!):

不存在从对象类型DocumentNumber到已知托管提供程序本机类型的映射

我的问题:有没有可能向我的类添加一个Widening Operator,当被分配给一个没有提供数据类型的ToInteger()1时,它会返回它的.ToString()方法(像这样):

m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber)) 'Convert as a string for the SqlParameter

我把这个问题标记为VB&c作为任何一种语言的解决方案都是合适的。

是否可以为SqlParameter实现加宽运算符

这里的问题是SqlParameter构造函数采用类型为Object的参数。

由于所有类都继承自Object,因此在添加值时不会调用加宽运算符。

这是因为DocumentNumber类型的值已经是Object类型,所以不需要转换为String

我认为您最好的选择是创建一些代码模式。您可以在SqlParameterCollection上创建一个扩展方法,如:

Module SqlParameterExtensions
  <Extension()>
  Public Sub MyAddWithValue(coll As SqlParameterCollection, paramName As String, paramValue As Object)
    If (TypeOf paramValue Is DocumentNumber) Then
        coll.AddWithValue(paramName, paramValue.ToString())
    Else
        coll.AddWithValue(paramName, paramValue)
    End If
  End Sub
End Module

并称之为

Module Module1
    Sub Main()
        Dim com As New SqlCommand
        Dim docNo As New DocumentNumber
        com.Parameters.MyAddWithValue("@DOC_NO", docNo)
    End Sub
End Module

或者您可以为SqlParameters创建一个"工厂"方法;

Public Shared Function CreateParameter(name As String, value As Object) As SqlParameter
    If (TypeOf value Is DocumentNumber) Then
        value = value.ToString()
    End If
    Return New SqlParameter(name, value)
End Function