में पूर्ण मान पास करना मैं एक 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;
धन्यवाद, मैं इस कोशिश की, एक ही त्रुटि मिलती है के रूप में @ pf1957 टिप्पणी में ऊपर बताया गया है। मावे मेरे पास कुछ और है जो इस त्रुटि को परेशान कर रहा है? – Alex
सहायता के लिए धन्यवाद, अपडेट देखें। – Alex