2009-11-17 12 views
6

मैं एक varchar इनपुट पैरामीटर के साथ Sql सर्वर 2005 में एक संग्रहीत प्रक्रिया को परिभाषित किया है के रूप में:एडीओ और वीबी के साथ संग्रहीत प्रक्रिया इनपुट पैरामीटर में नल या खाली स्ट्रिंग कैसे पास करें?

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

हैं:

@Value varchar(24) = NULL 
मेरी VB6 आवेदन में

मैं एक एडीओ समारोह के साथ पैरामीटर सेट करने का प्रयास

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

मैं खाली सेंट के बजाय एक शून्य मान पास करने की कोशिश की: मूल्य मैं पारित करने के लिए कोशिश एक खाली (शून्य लंबाई) स्ट्रिंग, तो मैं निम्नलिखित त्रुटि मिलती है अंगूठी, लेकिन यह विभिन्न त्रुटियों के लिए नेतृत्व।

मैं संग्रहीत प्रक्रिया में खाली तार या नल मान कैसे पास कर सकता हूं?

मैंने पहले से ही बहुत सारे लेख पढ़े हैं और फ़ोरम खोजे हैं (यहां तक ​​कि मेरे प्रश्न को कई बार भी मिला है) लेकिन सही उत्तर के बिना।

खाली तारों के लिए अभी तक कामकाज लंबाई = 1 सेट करना है या स्ट्रिंग = "" (एक रिक्त स्थान) सेट करना है। लेकिन यह वास्तव में अच्छा नहीं है और मैं न्यूल भेजने के पक्ष में हूं। मैंने vbNull, null, vbNullString पर paramValue को सेट करने या किसी भी भाग्य के बिना prmParamVal.value = खाली सेट करने के लिए प्रयोग किया!

उत्तर

10

यहां एक त्वरित परीक्षण से पता चलता है कि नौकरी को नौकरी करना चाहिए। नमूना कोड मैं (एक सरल रूप पर एक बटन और एक पाठ बॉक्स के साथ) का परीक्षण करने के लिए प्रयोग किया जाता:

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 

और यह इस संग्रहीत proc कहा जाता है:

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 (ऊपर दिए गए नमूने के अनुसार), और vbNull के लिए 'नॉट न्यूल'। यदि Null आपके लिए काम नहीं करता है, तो मैं इस पर टिप्पणी नहीं कर सकता कि क्या गलत हो सकता है ...!

इसी तरह, खाली तारों को उसी तरह से पारित किया जाना चाहिए - एक खाली स्ट्रिंग, यानी str = "" - जो usp_Bob को 'EMPTY' वापस कर देता है। किसी और चीज ने इसे 'न्यूल और नहीं इंपटी' (जैसा कि अपेक्षित) वापस कर दिया है। यानी,

IF @param = '' 
    SET @param = NULL 

ध्यान दें कि लंबाई आप के माध्यम से पारित कोई फर्क नहीं करना चाहिए -

आप शून्य के माध्यम से पारित नहीं मिल सकता है, तो एक और विकल्प sproc में शून्य करने के लिए एक खाली स्ट्रिंग कास्ट करने के लिए है बहुत ज्यादा। यह आपके द्वारा गुज़रने वाले डेटा की लंबाई के बजाय SQL सर्वर में परिभाषित पैरामीटर की अधिकतम लंबाई का प्रतिबिंब है।

+0

आह! ठीक है, मुझे लगता है कि आपकी आखिरी वाक्य महत्वपूर्ण थी! शून्य के साथ मेरी समस्या हमेशा शून्य की लंबाई थी - जो एक त्रुटि की ओर जाता है।तो मेरे डीबी में पैरामीटर को वर्कर (24) के रूप में परिभाषित किया गया है, मैं बिना किसी नुकसान के 24 तक सेट कर सकता हूं? –

+1

हाँ - जैसे आपका स्पोक एक वचर (24) है, लंबाई 24 तक सेट करें। इसका कोई बुरा प्रभाव नहीं होगा। –

4

में अशक्त डालने पैरामीटर मान के रूप में DBNull.Value पारित अगर आप एक पैरामीटर हमें adBSTR adVarChar के बजाय करने के लिए एक खाली स्ट्रिंग पारित करने के लिए चाहते हैं। यह शून्य से अधिक समय तार के लिए काम करता भी

वर्ण

जैसे (जहां oCmd प्रश्न में आदेश वस्तु है):

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