2013-06-11 11 views
5

में पूर्ण मान पास करना मैं एक TSQLDataset पैरामीटर के लिए शून्य मान में पास करने का प्रयास कर रहा हूं। क्वेरी में फॉर्म है:पैरामीटरकृत डेल्फी SQL सर्वर क्वेरी

Query_text:='MERGE INTO [Table] 
      USING (VALUES (:A,:B)) AS Source (Source_A, Source_B) 
      .... 
      WHEN MATCHED THEN 
      UPDATE SET A = :A 
      WHEN NOT MATCHED THEN 
      INSERT(A, B) VALUES (:A,:B); 

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:=Query_text; 

SQL_dataset.ParamByName('A').AsString:='A'; 
SQL_dataset.ParamByName('B').AsString:={ COULD BE NULL, OR A STRING };  

SQL_dataset.ExecSQL; 

पैरामीटर बी शून्य है, लेकिन यह एक विदेशी कुंजी भी है। यदि उपयोगकर्ता इस क्षेत्र में कुछ प्रविष्ट करता है, तो बी को किसी अन्य तालिका में मानों के विरुद्ध सत्यापित किया जाना चाहिए। यदि यह खाली है तो मैं इसे अनदेखा करना चाहता हूं। मैं '' में गुजर रहा था, लेकिन यह स्पष्ट रूप से एक एफके उल्लंघन त्रुटि पैदा करता है।

मैंने कोशिश की:

SQL_dataset.ParamByName('B').Value:=Null; 

..लेकिन फिर मैं एक त्रुटि "dbExpress ड्राइवर tdbxtypes.unknown डेटा प्रकार का समर्थन नहीं करता" मिलता है।

मैं भी करने की कोशिश की:

SQL_dataset.ParamByName('B').DataType:=ftVariant; 
SQL_dataset.ParamByName('B').Value:=Null; 

..लेकिन फिर मिला त्रुटि "dbExpress ड्राइवर tdbxtypes.variant डेटा प्रकार का समर्थन नहीं करता"।

सुनिश्चित नहीं है कि मैं क्या गलत कर रहा हूं, किसी भी मदद की सराहना की जाएगी। मैं वर्तमान में स्ट्रिंग आबादी के आधार पर पैरामीटर सूची तैयार कर रहा हूं या नहीं, और यह अच्छी तरह से काम करता है; यह थोड़ा सा गड़बड़ है (मेरी वास्तविक क्वेरी में) क्योंकि सत्यापन के लिए कुछ पैरामीटर हैं।

मैं डेल्फी XE4 और SQL सर्वर का उपयोग कर रहा 2012

अद्यतन:

सभी मदद के लिए धन्यवाद, अपने सुझाव, सही सब साथ थे यह है कि कि 'dbExpress ड्राइवर' का उत्पादन किया कुछ और ही था त्रुटि। मैं के प्रयास में एक 'लचीला' पैरामीटर सूची बनाने गया था मेरी समस्या से बचने के लिए, और इस का अपवाद उत्पन्न:

Parameter_string:=''; 

If B<>'' then Parameter_string:='B = :B,' 

Query_text:='MERGE ...' 
      '...' 
      'UPDATE SET A = :A, '+Parameter_string+' C = :C' .... 

... विचार किया जा रहा है कि अगर बी खाली है तो पैरामीटर नहीं होगा ' क्वेरी में सूचीबद्ध '।

यह काम नहीं करता है, या इसका मेरा कार्यान्वयन काम नहीं करता है (यकीन नहीं है कि, मैं स्पष्ट रूप से कहीं एक कदम क्यों खो रहा हूं)।

वैसे भी, काम कर कोड:

Query_text:='MERGE ...' 
      '...' 
      'UPDATE SET A = :A, B = :B, C = :C' .... 

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:=Query_text; 

If B<>'' then 
begin 
    SQL_dataset.ParamByName('B').AsString:='B'; 
end 
else 
begin 
    SQL_dataset.ParamByName('B').DataType:=ftString; 
    SQL_dataset.ParamByName('B').Value:=Null; 
end; 

उत्तर

1

अगर मैं सही ढंग से याद है, डेल्फी में db-शून्य बराबर Variants.Null

है
0

सामान्य दृष्टिकोण क्वेरी के साथ और उचित आवंटित एक बार पैरामीटर्स का उपयोग किया जाएगा डाटा प्रकार। मूल्य NULL को सौंपा जा सकता है।

var 
Query_text:String; 
begin 
    Query_text:='Declare @A varchar(100) ' // or e.g. integer 
     +#13#10'Declare @B varchar(100)' 
     +#13#10'Select @A=:A' 
     +#13#10'Select @B=:B' 
     +#13#10'Update Adressen Set [email protected],[email protected] where [email protected]'; 
    SQL_dataset.CommandType := ctQuery; 
    SQL_dataset.CommandText := Query_text; 
    SQL_dataset.Params.ParseSQL(SQL_dataset.CommandText,true); 
    Showmessage(IntToStr(SQL_dataset.Params.Count)); 
    SQL_dataset.ParamByName('B').DataType := ftString; 
    SQL_dataset.ParamByName('B').Value := 'MyText'; 
    SQL_dataset.ParamByName('A').DataType := ftString; // or e.g. ftInteger 
    SQL_dataset.ParamByName('A').Value := NULL; 
    SQL_dataset.ExecSQL; 
end; 
+0

धन्यवाद, मैं इस कोशिश की, एक ही त्रुटि मिलती है के रूप में @ pf1957 टिप्पणी में ऊपर बताया गया है। मावे मेरे पास कुछ और है जो इस त्रुटि को परेशान कर रहा है? – Alex

+0

सहायता के लिए धन्यवाद, अपडेट देखें। – Alex

2

के बारे में क्या:

SQL_dataset.ParamByName('B').Clear;

+0

मैंने उस सुझाव को कहीं और पढ़ा था, लेकिन मुझे लगता है कि "dbExpress ड्राइवर TDBXTypes.UNKNOWN डेटा प्रकार का समर्थन नहीं करता है। विक्रेता त्रुटि संदेश:" जब मैं कोशिश करता हूं तो त्रुटि। क्या मैं कुछ और गलत कर रहा हूँ? – Alex

+0

अजीब ...वर्तमान में मैं एफआईबी + से फायरडीएसी में माइग्रेट कर रहा हूं और मैंने इसे दोनों कनेक्टिविटीज पर परीक्षण किया है और या तो साफ़ या वैल्यू का उपयोग करना संभव है: = शून्य असाइनमेंट। और मुझे उम्मीद है कि यह प्रत्येक डेटासेट पर काम करेगा। कम से कम मैंने कभी इस समस्या से मुलाकात नहीं की है, लेकिन मैंने कभी भी dbExpress का उपयोग नहीं किया। – pf1957

+0

फिर से धन्यवाद, आप सही हैं, ऊपर अपडेट देखें। – Alex

संबंधित मुद्दे