我有一个简单的函数,它根据像这样的内联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#中的答案也没问题。
由于
答案 0 :(得分:2)
你的函数应该返回nullable integer,当你的SQL服务器什么也不返回时返回Nothing
或DBNull
(如果你不想在没有行之间产生差异)返回和 DBNull )。
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
答案 1 :(得分:1)
如果SQL查询返回整数或空值,您可能希望函数返回可为空的int({C#中的int?
而不是对象),以提高类型的安全性。
答案 2 :(得分:1)
将执行返回类型(如果不是DBNull)从ExecuteScalar转换为整数。您可以返回nullable int类型(C#中的int?)。
答案 3 :(得分: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