Бърз тест тук показва, че NULL трябва да свърши работа. Примерен код, който използвах за тестване (върху прост формуляр с един бутон и едно текстово поле):
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 върна 'NULL' за използване на VB стойността Null
(съгласно примера по-горе) и 'NOT NULL' за vbNull
. Ако Null
не работи за вас, тогава не мога да коментирам какво може да не е наред...!
По същия начин празните низове трябва да се предават точно така -- празен низ, т.е. str = ""
-- което кара usp_Bob да връща „ПРАЗЕН“. Всичко друго връща 'NOT NULL AND NOT EMPTY' (както се очаква).
Ако не можете да преминете през NULL, тогава друга опция е да прехвърлите празен низ към NULL в sproc -- т.е.
IF @param = ''
SET @param = NULL
Имайте предвид, че дължината, през която преминавате, не трябва да има голямо значение. Това е отражение на максималната дължина на параметъра, както е дефиниран в SQL Server, а не на дължината на данните, през които преминавате.