2009-12-04 20 views
6

मैं चाहते हैं एक मनमाना एसक्यूएल SELECT कथन को पार्स और विभिन्न घटक भागों को पुनः प्राप्त करने में सक्षम हो (स्तंभों, संबंध, स्थिति, जहां की स्थिति, स्तंभों के आधार पर शामिल होने के), आदर्श डेल्फी का उपयोग कर। एक त्वरित Google खोज कई अलग-अलग फ्रीवेयर उत्पादों को दिखाती है, लेकिन यह स्पष्ट नहीं है कि वे पूर्ण हैं और/या सक्रिय विकास के तहत हैं।लाइब्रेरी पार्स करने के लिए SQL कथन

मेरे तत्काल बस यह सुनिश्चित करें कि आवश्यक विचार या टेबल मौजूद इससे पहले कि मैं दृश्य बनाने के लिए कोशिश ऑर्डर में परिभाषाओं की एक श्रृंखला में प्रयोग किया जाता संबंधों की सूची निकालने के लिए की जरूरत है। तो, उदाहरण के लिए, बयान के लिए:

SELECT PersonID, LastName, OrderID 
FROM People P INNER JOIN Orders O ON P.PersonID = O.PersonID 

मैं "लोग" और "आदेश" मान वापस पाने के लिए की जरूरत है। (जाहिर है, यह एक साधारण उदाहरण है। मैं अधिक जटिल मामलों को संभालने में सक्षम होना चाहता हूं, उदाहरण के लिए, "FROM" शब्द अभिव्यक्ति के हिस्से के रूप में कॉलम सूची में दिखाई दे सकता है)।

मैं एक डेटाबेस है कि DLLs से निर्यात STDCALL कार्यों के उपयोग की अनुमति देता में इस सेवा प्रदान करने के लिए कोशिश कर रहा हूँ, इसलिए आदर्श किसी भी उम्मीदवार पुस्तकालय डेल्फी या सी

से प्रतिदेय
+0

आप संभवतः मुझे बता सकते हैं जो एसक्यूएल इंजन अपने का उपयोग कर? जब तक मैं इसे याद नहीं करता। – Reallyethical

+0

खुश रहें, लेकिन यह आपकी मदद नहीं करेगा। मैं आर: बेस का उपयोग कर रहा हूँ। –

उत्तर

6

Gold Parser. पर एक नजर डालें यह एक डेल्फी संस्करण उपलब्ध मिला है, और डाउनलोड पेज पर एसक्यूएल व्याकरण।

+0

धन्यवाद। यह मेरी Google खोज में नहीं आया, संभवतः क्योंकि SQL भाग पार्सर और डेल्फी के उल्लेख से अलग पृष्ठ पर है। –

+0

हाँ, यह अस्पष्ट है। अच्छी प्रणाली, यद्यपि। –

0

एसक्यूएल पारसर्स जटिल हैं होगा।

  1. लेन-देन शुरू:

    आप इस तरह के दृष्टिकोण के बारे में सोच किया।

  2. सर्वर पर CREATE VIEW आदेश भेजें।
  3. त्रुटि पकड़ें (कोई भी सभ्य डेटाबेस ड्राइवर ऐसा करने में सक्षम होना चाहिए)।
  4. यदि कोई त्रुटि हुई, तो त्रुटि संदेश पार्स करें और क्लाइंट को अनुपलब्ध तालिकाओं को दिखाएं।

    => begin; 
    BEGIN 
    => create view testview as select foo,bar from a join b on a.x=b.y; 
    ERROR: relation "a" does not exist 
    LINE 1: create view testview as select foo,bar from a join b on a.x=... 
                    ^
    => rollback; 
    ROLLBACK 
    

    या यह एक (Oracle):

  5. रोलबैक

इस उदाहरण (PostgreSQL) को देखने के

SQL> create view testview as select foo,bar from a join b on a.x=b.y; 
create view testview as select foo,bar from a join b on a.x=b.y 
                * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

SQL> rollback; 

Rollback complete. 
+0

हां, यही वह है जो मैं वर्तमान में कर रहा हूं। अगर मैं उस समय समस्या का पता लगा सकता हूं जब मैं मूल डेटाबेस से अपनी संरचना परिभाषा फ़ाइल बना देता हूं, हालांकि, मैं उनमें से कुछ को तुरंत हल कर सकता हूं (अनिवार्य रूप से, मैं डेटाबेस में सभी दृश्य परिभाषाओं में एक पारगमन बंद करने की कोशिश कर रहा हूं, जो दुर्भाग्य से डीबीएमएस विचारों की सूची प्रदान करते समय नहीं करता है)। –

+0

हा। यह निश्चित रूप से एक हैक है, लेकिन मजेदार है। दुर्भाग्यवश पोस्टर ने यह नहीं कहा कि उसके पास काम करने के लिए एक चल रहे डेटाबेस सर्वर भी थे।ऐसा कुछ करने से पहले, सुनिश्चित करें कि आप संभावित खतरे वाले वैक्टरों की जांच करें! – Dolph

+0

मैं डीबी नहीं होने पर सही खड़ा हूं। जब आप मेरी प्रतिक्रिया लिख ​​रहे थे, तो आपने पोस्ट किया, लैरी। :) – Dolph

0

आप एडीओडीबी के साथ डेल्फी का उपयोग कर सकते हैं।

यह जांचने के लिए एक TADOQuery का उपयोग करें कि आपकी क्वेरी अच्छी है या नहीं, वास्तव में रिकॉर्डसेट खोलने के बिना। आप क्वेरी के फ़ील्ड नामों को भी पुनः प्राप्त कर सकते हैं।

एक फॉर्म पर एक TADOConnection ड्रॉप करें। एक TMemo और एक TButton ड्रॉप और इस कोड का प्रयास करें:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    lADOQuery : TADOQuery; 
    lFieldNames : TStrings; 
begin 
    lADOQuery := TADOQuery.Create(nil); 
    try 
    lADOQuery.Connection := ADOConnection1; 
    lADOQuery.SQL.Text := Memo1.Text; 
    lFieldNames := TStringList.create; 
    try 
     lADOQuery.GetFieldNames(lFieldNames); 

     showmessage(lFieldNames.Text); // Show fieldNames of the query 

     // To show that the dataset is not actually opened try this : 
     // Throws an exception (Dataset closed) 
     //showmessage(inttostr( lADOQuery.RecordCount)); 
    except 
     On e: Exception do 
     ShowMessage('Invalid query'); 
    end; 
    lFieldNames.free; 
    finally 
    lADOQuery.free; 
    End; 
end; 
+0

मेरा डीबीएमएस एडीओ का उपयोग करके सुलभ नहीं है। –

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