Một bài kiểm tra nhanh ở đây cho thấy NULL phải thực hiện công việc. Mã mẫu tôi đã sử dụng để kiểm tra (trên một biểu mẫu đơn giản với một nút và một hộp văn bản):
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
Và nó được gọi là proc được lưu trữ này:
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 trả về 'NULL' vì sử dụng giá trị VB Null
(theo mẫu ở trên) và 'NOT NULL' cho vbNull
. Nếu Null
không hiệu quả với bạn, thì tôi không thể bình luận về điều gì có thể sai ...!
Tương tự như vậy, các chuỗi trống cũng phải được chuyển như vậy - một chuỗi rỗng, tức là str = ""
- khiến usp_Bob trả về 'EMPTY'. Bất cứ điều gì khác có nó trả về 'NOT NULL VÀ NOT EMPTY' (như mong đợi).
Nếu bạn không thể chuyển NULL qua, thì một tùy chọn khác là truyền một chuỗi rỗng thành NULL trong mầm - tức là
IF @param = ''
SET @param = NULL
Lưu ý rằng độ dài bạn đi qua không quá quan trọng. Nó phản ánh độ dài tối đa của tham số như được xác định trong SQL Server chứ không phải độ dài của dữ liệu bạn đang truyền qua.