ここでの簡単なテストは、NULL が仕事をするべきであることを示しています。テストに使用したサンプル コード (1 つのボタンと 1 つのテキスト ボックスを持つ単純なフォーム):
Private Sub Command1_Click()
Dim dbConn As ADODB.Connection
Dim dbComm As ADODB.Command
Dim dbRS As ADODB.Recordset
Set dbConn = New ADODB.Connection
With dbConn
.ConnectionString = "...REPLACE THIS ACCORDINGLY..."
.ConnectionTimeout = 10
.Open
End With
Set dbComm = New ADODB.Command
With dbComm
.ActiveConnection = dbConn
.CommandType = adCmdStoredProc
.CommandText = "usp_Bob"
.Parameters.Append .CreateParameter("b", adVarChar, adParamInput, 10, Null)
Set dbRS = .Execute
End With
Text1.Text = dbRS.Fields.Item(0).Value
dbRS.Close
dbConn.Close
End Sub
そして、このストアド プロシージャを呼び出しました:
ALTER PROCEDURE usp_Bob
@b VARCHAR(10)
AS
IF @b IS NULL
SELECT 'NULL' AS '1'
ELSE
IF @b = ''
SELECT 'EMPTY' AS '1'
ELSE
SELECT 'NOT NULL AND NOT EMPTY' AS '1'
usp_Bob は、VB 値 Null
を使用するために 'NULL' を返しました (上記のサンプルのように)、および vbNull
の場合は 'NOT NULL' . Null
の場合 うまくいかない場合は、何が問題なのかコメントできません...!
同様に、空の文字列はそのまま渡す必要があります -- 空の文字列、つまり str = ""
-- これにより、usp_Bob は「EMPTY」を返します。それ以外の場合は、'NOT NULL AND NOT EMPTY' が返されます (予想どおり)。
NULL を渡すことができない場合は、sproc で空の文字列を NULL にキャストするという別のオプションがあります -- つまり、
IF @param = ''
SET @param = NULL
通過する長さはあまり重要ではないことに注意してください。これは、通過するデータの長さではなく、SQL Server で定義されているパラメータの最大長を反映しています。