0

我有一个简单的函数,它基于这样的内联 SQL 语句(简化版)从数据库中返回单个列的数据:

Function GetId(ByVal name As String) As Object

    Dim sql As String = "Select Id From table where username = '" & name & "'"

    Using cmd As New SqlCommand
        cmd.Connection = conn
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql
        GetId = cmd.ExecuteScalar
    End Using

End Function

如果 SQL 返回一行,它可以是 NULL 或整数,或者 SQL 不返回任何内容。

在代码的另一部分,我有:

Dim userId As Object = New Object

userId = GetBillingGroupToInvoice(name)

在这里使用 Object 作为返回类型是否可以。如果不是,我应该指定什么作为这个函数的返回类型?这是在 VB 中,但在 C# 中的答案也可以。

谢谢

4

4 回答 4

2

您的函数可能应该返回一个可为空的 integerNothing当您的 SQL 服务器不返回任何内容或DBNull(如果您不想在No rows returnedDBNull之间产生差异)时返回。

Function GetId(ByVal name As String) As Integer?

    Dim sql As String = "Select Id From table where username = '" & name & "'"

    Using cmd As New SqlCommand
        cmd.Connection = conn
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql
        Dim result = cmd.ExecuteScalar
        Return If(DBNull.Value.Equals(result), 
                  Nothing, 
                  DirectCast(result, Integer?))
    End Using

End Function

然后,你会这样调用你的方法:

Dim userId = GetBillingGroupToInvoice(name)
If userId.HasValue Then
    'Do something with userId.Value'
End If
于 2012-08-30T11:40:48.327 回答
1

如果 SQL 查询返回整数或空值,您可能希望函数返回可空的 int(int?在 C# 中)而不是对象,以提高类型安全性。

于 2012-08-30T11:30:13.600 回答
1

将返回类型(如果不是 DBNull)从 ExecuteScalar 转换为整数。您可以返回可为空的 int 类型(C# 中的 int?)。

于 2012-08-30T11:31:14.640 回答
1

您应该指定Integer返回类型而不是Object.

Function GetId(ByVal name As String) As Integer
    Dim sql As String = "Select Id From table where username=@name"
    Dim retValue as Integer = -1
    Using cmd As New SqlCommand
        cmd.Connection = conn
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql
        cmd.Parameters.Add("@name",SqlDbType.VarChar,30).Value=name
        Dim result = cmd.ExecuteScalar()
        if Not IsNothing(result) And Not IsDBNull(result) Then
            retValue=CType(result,Integer)
        End If
    End Using
    return retValue
End Function
于 2012-08-30T11:32:27.070 回答