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

関数はおそらくnull 許容整数を返す必要があります。これNothingは、SQL サーバーが何も返さない場合、または( No rows returnedDBNullDBNullの違いを作りたくない場合) に返されます。

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

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 に答える
1

SQL クエリが整数値または null 値を返す場合、int?型の安全性を高めるために、オブジェクトではなく null 許容の int (C# では) を関数で返すことができます。

于 2012-08-30T11:30:13.600 に答える
1

戻り型 (DBNull でない場合) を ExecuteScalar から整数にキャストします。nullable int の型を返すことができます (C# では int? )。

于 2012-08-30T11:31:14.640 に答える