2009-04-26 10 views
9

मैं वर्तमान में एक परियोजना के लिए कुछ मूल्यांकन कार्य पर काम कर रहा हूं जिसका मैं योजना बना रहा हूं।मैं एक .NET DLL में SQLite डेटाबेस कैसे एम्बेड कर सकता हूं और फिर इसे C# से उपयोग कर सकता हूं?

मैंने हाल ही में अपने आवेदन के लिए डेटा स्टोरेज तंत्र के लिए समाधान देखा और SQLite पर ठोकर खाई। मैं वर्तमान में System.Data.SQLite wrapper के साथ SQLite का उपयोग करता हूं।

मुझे वास्तव में जिस तरह से काम करता है उसे पसंद है लेकिन मुझे इसके साथ एक समस्या है कि मैं तय नहीं कर सका और मुझे इंटरनेट पर मेरी समस्या से संबंधित कोई मदद भी नहीं मिली।

मैं अपने SQLite डेटाबेस को इस डीएलएल के भीतर उपयोग किए जाने वाले मेरे अनुप्रयोग DLLs (यानी Title.Storage.dll) में एम्बेड करने के लिए चाहता हूं। क्या यह संभव है?

तब मैं डेटाबेस तक कैसे पहुंच सकता हूं?

यह बहुत अच्छा है कि अगर मैं कुछ इस तरह इस्तेमाल कर सकते हैं होगा:

SQLiteConnection con = new SQLiteConnection(); 
con.ConnectionString="DataSource=Title.Storage.storage.db3"; 
con.Open(); 

अग्रिम धन्यवाद और सादर,

3Fox

+3

यह संभवतः संभव नहीं हो सकता है जोड़ें। आप डेटाबेस में कैसे लिखेंगे? आपको लेखन के लिए असेंबली खोलनी होगी। जवाब नहीं दे रहा क्योंकि मैं तकनीकी विवरण प्रदान नहीं कर सकता। – Will

+1

यहां तक ​​कि यदि यह संभव था, तो भी मुझे लगता है कि यह कुछ सुरक्षा सूट पागल - एक कोड फ़ाइल में बड़े, निरंतर परिवर्तन भेज देगा। – dommer

+2

यदि आपके पास थोड़ी सी * केवल पढ़ने के लिए * डेटा था जिसे आप क्वेरी करना चाहते थे, तो शायद यह ठीक काम करेगा - संसाधन को इन-मेमोरी डेटाबेस में पढ़ें और इसे पूछें। – Shog9

उत्तर

14

एक विधानसभा फ़ाइल भंडारण के लिए नहीं है, यह कोड के लिए है भंडारण। जबकि आप एक असेंबली में फ़ाइलों को स्टोर कर सकते हैं, वे केवल पढ़े जाते हैं।

+0

संसाधन निश्चित रूप से केवल कोड से पढ़े जाते हैं। – Will

+5

केवल पढ़ने के लिए डेटाबेस के बारे में क्या? –

1

आप कर सकते हैं है कि बस एक संसाधन के रूप में फाइल को एम्बेड, लेकिन आप उस के बाद आप इस फाइल को और गर्म बैकअप यह SQLite स्मृति डाटाबेस में लेने के लिए और फ़ाइल को नष्ट कर सकते हैं DLL से डीबी निकालने के लिए की आवश्यकता होगी, द्वारा (या बस उस फाइल को खोलें)। अगर आपको एक विवरण की आवश्यकता होगी - एक टिप्पणी छोड़ दो।

+0

कृपया विवरण प्रदान करें। मैं इसी तरह के समाधान की तलाश में हूं। मैं परीक्षण चलाने के लिए इस्तेमाल डीबी जहाज भेजना चाहता हूँ। मैं हॉटबैक दोनों विकल्पों को एक्सप्लोर करना चाहता हूं और बस फ़ाइल खोलें –

0

यदि आप एनटीएफएस पर हैं, तो आप वैकल्पिक डेटा स्ट्रीम का उपयोग कर सकते हैं। मेरी प्रोजेक्ट पर हम एक वैकल्पिक स्ट्रीम का उपयोग कर SQL फ़ाइल डेटाबेस को दूसरी फ़ाइल के अंदर छिपाते हैं: डीबी।

+0

क्या होता है यदि मैं फ़ाइल को FAT32 विभाजन और वापस कॉपी करता हूं? – Lucas

+0

फ़ाइल को FAT विभाजन में कॉपी करने के बाद आप वैकल्पिक स्ट्रीम खो देंगे। – mateusza

-2

SQLite को पैक किया गया है और कुछ सी (3 मुझे लगता है) शीर्षलेख फ़ाइलों के साथ एक सी फ़ाइल के रूप में वितरित किया जाता है। इसका मतलब है कि आप पूरे 50000 लाइन प्रोग्राम को संकलित कमांड के साथ संकलित कर सकते हैं और एक .o फ़ाइल प्राप्त कर सकते हैं। वहां से, आप इसे अपने डीएलएल में लिंक की गई अन्य फ़ाइलों के साथ अपने एप्लिकेशन डीएलएल में लिंक कर सकते हैं।

एक बार जब आप अपने आवेदन डीएलएल में sqlite3.o बनाते हैं, तो इसके SQLite के एपीआई में प्रतीकों को आपके प्रोग्राम के लिए उपलब्ध हो जाता है जैसे कि आपके अन्य सी/सी ++ डीएलएल आपके सी #/वीबी कार्यक्रमों में उपलब्ध हो जाते हैं।

अधिक जानकारी के लिए www.sqlite.org/amalgamation.html देखें।

+2

वह पूरी तरह से नहीं था जिसे मैं प्राप्त करने की कोशिश कर रहा था। मैं डेटाबेस फ़ाइल को एक डीएल में एम्बेड करना चाहता हूं जो डीएल नहीं है जो मुझे इसे एक्सेस करने की अनुमति देता है। – chrischu

0

मुझे नहीं लगता कि डीएलएल में डेटा संग्रह करना एक अच्छा विचार है, लेकिन ऐसा करने का एक गंदा तरीका है।

DLL से डेटा लोड करने के लिए:

  1. उपयोग System.Reflection.Assembly DLL फ़ाइल से एक तार लोड करने के लिए। (स्ट्रिंग डीबी का डंप है)
  2. स्मृति में खाली SQLite डीबी बनाएँ।
  3. अपनी सामग्री को पुनर्स्थापित करने के लिए डीबी को एक क्वेरी के रूप में लोड की गई स्ट्रिंग का उपयोग करें।

अब आप स्मृति में कोई प्रश्न पूछ सकते हैं।एक स्ट्रिंग में

  1. डंप डीबी सामग्री:

    DLL करने के लिए डेटा को बचाने के लिए।

  2. सी # कोड में लिपटे एसक्यूएल-डंप युक्त अस्थायी फ़ाइल बनाएं।
  3. इसे "सीएससी" (या "मोनो में" जीएमसीएस "का उपयोग करके संकलित करें)।

यह बेवकूफ है, लेकिन इसे काम करना चाहिए। आशा है कि आप इस तरह से कभी कोड नहीं करेंगे।

2

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

वितरित करने के लिए एक निष्पादन योग्य होने के कारण मुझे पसंद स्वाद का मामला है। आपके मामले में लेकिन समस्याएं अधिक हैं। यह केवल डीबी फाइल को एम्बेड करने के बारे में नहीं है, इसके साथ जुड़े डीएलएस के बारे में क्या? कदम 2 हैं:

1) के रूप में Embedded Resource(जरूरी नहीं कि एक) अपनी परियोजना के लिए अपने डाटाबेस के साथ जुड़े आवश्यक DLLs (System.Data.SQLite) जोड़ें और सिस्टम स्वचालित रूप से विधानसभा संबंधी विवादों का समाधान करते हैं। Catch it here इसे कैसे करें।

2) अब या तो अपनी परियोजना के अपने Resources करने के लिए अपने डाटाबेस फ़ाइल जोड़ने (और उसे निकालने के)

static void DumpDatabase() 
{ 
    var dbFullPath = Utility.GetDbFullPath(); //your path 
    if (File.Exists(dbFullPath)) 
     return; //whatever your logic is 

    File.WriteAllBytes(dbFullPath, Properties.Resources.myDb); 
} 

या भी बेहतर अपनी परियोजना में इस तरह के रूप db एम्बेड नहीं है, लेकिन करने के लिए तर्क बारे में अपने आवेदन में डेटाबेस बनाएँ। क्या होगा यदि कल आपको SQLite के संस्करण को बदलने की आवश्यकता है, तो 3 से 4 तक कहें? पहले दृष्टिकोण के साथ आपको अपने लिए डेटाबेस बनाने और प्रोजेक्ट में इसे फिर से एम्बेड करने की आवश्यकता है। लेकिन यदि आप अपने आवेदन में डीबी बनाने के लिए तर्क लिख रहे हैं तो SQLite संस्करण अपडेट करना केवल ADO.NET dll को बदलने का मामला है (कोड वही रहता है)। इस तरह हो सकता है:

static void DumpDatabase() 
{ 
    var dbFullPath = Utility.GetDbFullPath(); 
    if (File.Exists(dbFullPath)) 
     return; //whatever your logic is 

    CreateDb(dbFullPath); 
} 

static void Create(string dbFullPath) 
{ 
    SQLiteConnection.CreateFile(dbFullPath); 

    string query = @" 

    CREATE TABLE [haha] (.............) 
    CREATE TABLE .............."; 

    Execute(query); 
} 

और कनेक्शन स्ट्रिंग में FailIfMissing=False;

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

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