2009-11-17 17 views
6

Sql Server 2005'te depolanmış bir prosedürüm var:ADO ve VB ile saklı yordam giriş parametresine NULL veya boş dizeler nasıl iletilir?

@Value varchar(24) = NULL 

benim VB6 uygulamasında tanımlanmış bir varchar giriş parametresi ile parametre ADO işleviyle ayarlamaya çalışıyorum:

Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue) 

Değer Geçmeye çalışıyorum boş (sıfır uzunluk) bir dize, sonra aşağıdaki hatayı alıyorum:

ADODB.Connection error '800a0e7c' Parameter object is improperly defined. Inconsistent or incomplete information was provided.

Boş bir dize yerine bir NULL değeri geçirmeyi denedim, ancak bu farklı hatalara neden olur.

Boş dizeleri veya NULL değerlerini saklı yordama nasıl geçirebilirim?

Zaten çok fazla makale okudum ve forum aradım (hatta soruyu birkaç kez buldum) ama doğru cevaplamadan.

Boş dizeler için şimdiye kadarki çözüm, length = 1 değerini ayarlamak veya string = "" (boş alan) ayarlamaktır. Ama bu pek hoş değil ve NULL göndermek için tercih ederim. Ayrıca, paramValue öğesini, etcNull, Null, vbNullString ile ayarlamayı ya da prmParamVal.value = setini boş bırakmadan ayarlamayı denedim!

cevap

10

Hızlı bir test burada NULL'in işi yapması gerektiğini gösteriyor. Örnek kod I (bir düğme ve bir metin ile birlikte basit formda üzerine) test etmek için kullanılır:

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 

ve bu saklı yordam adı: usp_Bob VB değerini kullanarak 'NULL' geri

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' 

Null (yukarıdaki örnekte olduğu gibi) ve vbNull için 'NOT NULL'. Null sizin için uygun değilse, o zaman neyin yanlış olabileceğine yorum yapamıyorum ...!

Benzer şekilde, boş dizgiler, boş bir dize, yani str = "" - usp_Bob 'EMPTY' i döndüren - gibi iletilmelidir. Başka bir şey 'NULL AND THE EMPTY DEĞİL' (beklendiği gibi). yani

IF @param = '' 
    SET @param = NULL 

Not geçmesine uzunluğu önemli değildir gerektiğini - Eğer BOŞ geçerek alamıyorsanız

, sonra başka seçenek sproc NULL için boş bir dize atmak olduğunu çok fazla. Bu, geçirdiğiniz verinin uzunluğundan ziyade, SQL Server'da tanımlanan parametrenin maksimum uzunluğunun bir yansımasıdır. Bir sütun

+0

ah! tamam, son cümlenin önemli olduğunu düşünüyorum! Null ile olan problemim her zaman sıfırın uzunluğudur - bu da bir hataya neden olur.Yani benim db'de parametre varchar (24) olarak tanımlanırken herhangi bir dezavantaj olmaksızın uzunluğu 24'e ayarlayabilirim? –

+1

Yep - sproğunuz bir VARCHAR (24) olduğu için, uzunluğu 24 olarak ayarlayın. Herhangi bir yan etki olmaz. –

2

Hep parametre değeri olarak DBNull.Value geçmektedir. Daha uzun sıfırdan dizeleri çalışır çok

kömürleşir

mesela (ocmd söz konusu komut nesnesi olduğu):

 
oCmd.Parameters.Append oCmd.CreateParameter("@Parm", adBSTR, adParamInput, len(sParm), sParm) 
4

içine boş eklerken bize adBSTR yerine adVarChar bir parametreye boş dize geçirmek istiyorsanız

İlgili konular