2011-11-26 8 views
5

मुझे पूछने के लिए एक लंबा सवाल है। डेल्फी प्रोग्रामिंग की बात करते समय सबसे पहले मैं बहुत नया हूं और मेरे अनुभव में ज्यादातर एडीओ और एक्सेस डेटाबेस का उपयोग करके छोटे एकल उपयोगकर्ता डेटाबेस अनुप्रयोगों का विकास होता है।डेल्फी क्लाइंट-सर्वर एप्लिकेशन फ़ायरबर्ड 2.5 एम्बेडेड कनेक्शन त्रुटि का उपयोग कर

मुझे अब क्लाइंट सर्वर एप्लिकेशन में संक्रमण लेने की आवश्यकता है और यही वह समस्या है जहां समस्या शुरू होती है। मैंने अपने डेटाबेस के रूप में एम्बेडेड फायरबर्ड 2.5 का उपयोग करने का निर्णय लिया, क्योंकि यह ओपन सोर्स है, और इसका उपयोग डेल्फी में इंटरबेस घटक के साथ किया जा सकता है और कई क्लाइंट डेटाबेस को एक साथ एक्सेस कर सकते हैं। तो मैंने डेल्फी में इंटरबेस ट्यूटोरियल का पालन किया। मैं क्लाइंट को सर्वर से कनेक्ट करने और उदाहरण में डेटा देखने में कामयाब रहा (हालांकि दोनों मेरे पीसी पर चल रहे हैं), लेकिन जब मैंने क्लाइंट को दूसरे पीसी पर ले जाने की कोशिश की, तो सर्वर को मेरा रखकर और यह देखने के लिए चला कि मैं सर्वर से कनेक्ट कर सकते हैं यह मुझे निम्नलिखित त्रुटि दी।

0029DCAC पर मॉड्यूल क्लाइंट Demo.exe में अपवाद EIdSocketError। सॉकेट त्रुटि # 10061 कनेक्शन से इनकार कर दिया।

मैं समझता हूं कि ऐसा इसलिए हो सकता है क्योंकि मेजबान को क्लाइंट में लोकलहोस्ट के रूप में परिभाषित किया जाता है। लेकिन यहां मेरा पहला सवाल है। TSQLConncetion में आप ड्राइवर-> होस्टनाम के तहत मर होस्टनाम सेट कर सकते हैं। जो चीज़ मैं जानना चाहता हूं वह यह है कि आप इसे रन टाइम पर कैसे करते हैं, क्योंकि जब मैं कोशिश करता हूं और एक संपादन बॉक्स बना देता हूं, तो उपयोगकर्ता को मूल्य दर्ज करने की अनुमति देने के लिए और फिर इसे कोड के माध्यम से सेट करें: उदाहरण के लिए:

SQLConncetion1.Driver.Hostname: = edtHost.text; यह इस तरह से नहीं किया जा सकता है और एकमात्र तरीका है कि मैं देखता हूं कि आप मेजबाननाम ऑब्जेक्ट इंस्पेक्टर के साथ सेट कर सकते हैं, लेकिन यह रनटाइम पर उपलब्ध नहीं है और जब प्रोग्राम पहली बार चल रहा है, तो मुझे क्लाइंट पर होस्टनाम सेट करने की आवश्यकता है, तो आप रनटाइम पर होस्टनाम/आईपी पता कैसे सेट करते हैं?

इम का उपयोग कर डेल्फी XE2

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

+0

पहिया बदलने मत करो। आपके पास ओपन सोर्स क्लाइंट-सर्वर ओआरएम है जो जेएसओएन और एसक्यूएलसाइट 3 का उपयोग कर सर्विस-ओरिएंटेड-आर्किटेक्चर के साथ है [mORMot] (http://synopse.info/fossil/wiki?name=SQLite3+Framework)। कुछ डिज़ाइन या कार्यान्वयन विचार प्राप्त करने के लिए कम से कम कोड को देखने या 700 पृष्ठों के दस्तावेज़ों को पढ़ने के लायक हैं। –

उत्तर

3

एंबेडेड एक ही समय में कई उपयोगकर्ताओं द्वारा उपयोग नहीं किया जा सकता है (भले ही यह एक ही मशीन पर दो अनुप्रयोग हो)। तीन संस्करणों के बीच मतभेदों के बारे में जानकारी के लिए here देखें। अन्य SO question में भी जानकारी है जो मदद कर सकती है।

जहाँ तक रनटाइम पर एक सर्वर को निर्दिष्ट करने के रूप में, यह मदद मिल सकती है:

procedure TForm1.Button1Click(Sender: TObject); 
var 
Conn: TSQLConnection; 
begin 
    Conn := TSQLConnection.Create(Self); 
    try 
    Conn.DriverName := 'FirebirdConnection'; 
    Conn.Params.Add('User_Name=SYSDBA'); 
    Conn.Params.Add('Password=masterkey'); 

    // Replace the dbname in the next line with the 
    // value obtained at runtime, as in 
    // Conn.Params.Add('Database=' + YourNewPathAndDBName); 
    Conn.Params.Add('Database=C:\FireBirdData\YourDB.fdb'); 

    Conn.Open; 
    if Conn.Connected then 
     ShowMessage('Connection successfully made to DB'); 
    finally 
    Conn.Free; 
    end; 
end; 
+0

उपर्युक्त कोड के लिए धन्यवाद, लेकिन क्या आपको होस्टनाम भी सेट करने की ज़रूरत नहीं है ताकि ग्राहक को पता चले कि सर्वर कहां देखना है? या आप होस्टनाम localhost नाम देना चाहिए? – Japster

+1

एम्बेडेड के लिए, होस्टनाम की कोई आवश्यकता नहीं है, क्योंकि इसे केवल एक ही समय में एक एप्लिकेशन/कनेक्शन द्वारा एक्सेस किया जा सकता है। कृपया तीन प्रकार के फायरबर्ड सर्वर (क्लासिक, सुपरसर्वर, और एंबेडेड) के बीच अंतर के लिए प्रदान किए गए पहले लिंक पर जाएं; एक सारणी है जो उनके बीच मतभेद बताती है। –

+0

@ जैपस्टर ने यहां एक नजर डाली है http://www.connectionstrings.com/firebird मैंने फ़ायरबर्ड का उपयोग नहीं किया है, लेकिन मेरा मानना ​​है कि "डेटासोर्स = आईपी एड्रेस" पैरामीटर – ComputerSaysNo