2016-04-30 5 views
8

मैं एक .mdb फ़ाइल (MSAccess 2000 प्रारूप) से डेटा पढ़ रहा हूं। कुछ टेबल हैं जिनके नाम पर कोलन हैं।किसी तालिका पर क्वेरी कैसे चलाएं जिसमें कॉलन है?

EOleException with message 'Parameter object is improperly defined. Inconsistent or incomplete information was provided'. 

यह मेरा कोड है::

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

उत्तर

8

TQuery:if ParamCheck = true व्याख्या करेगा जब मैं इन टेबल पर प्रश्नों को खोलने का प्रयास मैं एक अपवाद हो रही है।
ParamCheck:= false सेट करें और फिर SQL.Text सेट करें।

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.ParamCheck:= false; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

अब यह काम करता है।

coloned तालिका/स्तंभ नाम और पैरामीटर
आपको निश्चित रूप से में कोलन के साथ तालिका/स्तंभ नाम का उपयोग करने का पथ नीचे जाना चाहिए और अभी भी तो आप मैक्रो का उपयोग कर सकते हैं अपने प्रश्न में कहीं पैरामीटर उपयोग करना चाहते हैं का मेल तालिका/कॉलम नाम भरने के लिए।
हालांकि इसके लिए फायरडाक की आवश्यकता है। मैं आपको इस बारे में बहुत सावधान रहने की सलाह देता हूं क्योंकि पैरामीटर मैक्रो के विपरीत एसक्यूएल इंजेक्शन के खिलाफ सुरक्षित नहीं है!

देखें: http://docwiki.embarcadero.com/CodeExamples/Seattle/en/FireDAC.TFDQuery.Macros_Sample

+0

पहले से जोड़े गए किसी भी पैरामीटर को हटाने के लिए मत भूलना। 'पैरामीटर 'संपत्ति की जांच करें। – GolezTrol

+0

@GolezTrol: 'SQL.Text' को स्वचालित रूप से 'पैरामीटर' साफ़ नहीं करता है? –

+1

यदि आप पैरामैक को गलत पर सेट करते हैं, तो मुझे लगता है कि यह नहीं है। यह सिर्फ पैरामीटर अकेले छोड़ देता है ताकि आप उन्हें स्वयं प्रबंधित कर सकें। 99% यकीन है। ;) – GolezTrol

4

मैं अन्य भाषाओं में समाधान की जाँच की गई थी। हालांकि Johan's answer सही एक लगता है, लेकिन एक पोस्ट here भी डेल्फी/पहुँच मामले में काम करता है:

`बैकटिक का उपयोग करते हुए चारों ओर अपने tablename अनुमति चाहिए यह परम चेक द्वारा ध्यान नहीं दिया जा करने के लिए।

Query.SQL.Text := 'select * from `Table1:1`'; 

यह भी क्वेरी स्ट्रिंग में पैरामीटर का उपयोग करने के साथ जोड़ा जा सकता है।

+0

मुझे डेल्फी के बारे में पता नहीं है, लेकिन एमएस एक्सेस * कभी * बैकटीक्स का उपयोग नहीं करता है। सारणी के साथ तालिका/फ़ील्ड नाम रिक्त स्थान हमेशा [वर्ग ब्रैकेट] की जरूरत है। – Andre

+0

@Andre मैंने अभी एमएस एक्सेस 2007 के अंदर एक क्वेरी बनाई है और SQL क्वेरी में यह क्वेरी स्ट्रिंग टाइप की है। यह परिणाम बिना किसी समस्या के दिखाता है। – saastn

+0

आप सही हैं (और मैं गलत था) - बैकटिक्स स्क्वायर ब्रैकेट के स्थान पर उपयोग किया जा सकता है। चौंका देने वाला। :) 'चुनें [Tabelle1: 1] .ID, \ 'Tabelle1: 1 \'। \ 'Nix: dings \' से [Tabelle1: 1];' काम करता है, बैकटिक्स के बिना यह नहीं करता है। – Andre

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