SQLite

2010-11-23 14 views
27

में विदेशी कुंजी बाधाओं को सक्षम करना मैं सी # के साथ SQLite का उपयोग कर रहा हूं और परिभाषित विदेशी कुंजी के साथ कुछ तालिकाओं का उपयोग कर रहा हूं।SQLite

अब, मुझे पता है कि डिफ़ॉल्ट रूप से विदेशी कुंजी बाधाओं को SQLite में लागू नहीं किया जाता है, लेकिन मैं उन्हें चालू करना चाहता हूं।

क्या कोड के माध्यम से ऐसा करना संभव है? मैंने एक संबंधित question देखा है, लेकिन मुझे यकीन नहीं है कि इसे सी # कोड के माध्यम से कैसे किया जाए। मैं अपनी टेबल डिज़ाइन करने के लिए विजुअल स्टूडियो 2008 के लिए उपलब्ध SQLite का नवीनतम प्लग-इन उपयोग कर रहा हूं।

conn.Open(); 
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn); 
cmd.ExecuteNonQuery(); 
conn.Close(); 

इस कनेक्शन को फिर से खोलने पर मुझे इस बदलाव की आवश्यकता है। क्या यह संभव है? pragma पर

उत्तर

47

अंत में this post से पता लगा। PRAGMA विदेशी_की सेटिंग जारी नहीं है लेकिन आप इसे कनेक्शन स्ट्रिंग में कनेक्शन के हर बार सेट कर सकते हैं। यह आपको विजुअल स्टूडियो के टेबल एडाप्टर का उपयोग करने की अनुमति देता है।

  1. सुनिश्चित करें कि आप latest version (1.0.73.0) system.data.sqlite स्थापित की (1.0.66.0 काम नहीं करेगा) किया है।
  2. अपना बदलें कनेक्शन स्ट्रिंग से data source=C:\Dbs\myDb.db;foreign keys=true; (अपने SQLite डेटाबेस के साथ C: \ Dbs \ myDb.db को प्रतिस्थापित करें)।
+1

मैं संस्करण 1.0.66.0 का उपयोग कर रहा था। मैं विदेशी कुंजी सुविधा के बिना आगे बढ़ गया। यह जानना अच्छा लगा कि इस मुद्दे को आखिरकार हल किया गया है। मैं इसे भविष्य के किसी भी काम के लिए ध्यान में रखूंगा। Thanx – kaustubh

+0

मैंने उल्लिखित सभी अन्य तरीकों का प्रयास किया इस पोस्ट में, और केवल यह मेरे लिए काम किया। –

+0

आप आदमी हैं :) –

4

बारी:

PRAGMA foreign_keys = ON; 

तुम बस किसी भी अन्य एसक्यूएल बयान की तरह इस पर अमल कर सकते हैं।

+1

मैं स्क्लाइटडाटा एडाप्टर का उपयोग कर रहा हूं, यह कनेक्शन खोलने और बंद करने का प्रबंधन करता है। मेरा मानना ​​है कि जब कनेक्शन बंद हो जाता है, तो यह जानकारी खो जाती है। मैं यह जानकारी कैसे बना सकता हूं? – kaustubh

+0

@ उस्टुब: आप सही हैं, विदेशी_की प्रगा सत्र-स्थानीय है। मुझे नहीं पता कि SQLiteDataAdapter कैसे काम करता है, लेकिन ऐसा लगता है कि इसके कन्स्ट्रक्टर में SQLConnection पैरामीटर लेता है। क्या आप इसे बनाते समय कनेक्शन के खिलाफ प्रगति जारी कर सकते हैं? –

+0

कनेक्शन स्ट्रिंग में इस जानकारी को निर्दिष्ट करने का कोई तरीका प्रतीत नहीं होता है। कनेक्शन को खोले जाने पर हर बार निष्पादित आदेश को निर्दिष्ट करने का कोई तरीका है? – kaustubh

1

ऐसा लगता है कि आप अपने डीबी कनेक्शन पर SQL कमांड PRAGMA foreign_keys = ON; निष्पादित कर सकते हैं जैसे कि आप एक चयन या अपडेट स्टेटमेंट करेंगे। हालांकि आपको यह सुनिश्चित करना है कि आपका SQLite विदेशी कुंजी और इस तरह से संकलित किया गया था। Here देखें।

2

ये जानकारी आप देख रहे हैं प्रदान करना चाहिए:

http://www.sqlite.org/faq.html#q22

http://www.sqlite.org/foreignkeys.html#fk_enable

संक्षेप में, 3.6.19 से पहले के संस्करणों में सभी विदेशी कुंजी को लागू नहीं है, लेकिन वे हो सकता है ट्रिगर्स का उपयोग करके अनुकरण; 3.6.1 9 से शुरू होने पर, विदेशी कुंजी लागू की जा सकती है, लेकिन इसे PRAGMA foreign_keys = ON कथन का उपयोग करके प्रति कनेक्शन सक्षम करने की आवश्यकता है, और स्क्लाइट को ट्रिगर और विदेशी कुंजी समर्थन सक्षम के साथ संकलित किया जाना चाहिए (जिसे मैं किसी बाइनरी के मामले में होने की उम्मीद करता हूं वितरण)।

+0

मैं SqliteDataAdapter का उपयोग कर रहा हूं जो स्वचालित रूप से कनेक्शन खोलने और बंद करने का प्रबंधन करता है। मैं प्रत्येक बार एक अद्यतन किए जाने पर इस PRAGMA को कैसे लागू करूं? – kaustubh

1

अपने कनेक्शन स्ट्रिंग में जोड़ें: ";EnforceFKConstraints=Yes|True|1;"

+0

मैं आपका जवाब देखने पर उत्साहित था, सही समाधान की तरह लग रहा था .. लेकिन हां, यह काम नहीं करता है :(शायद .NET के लिए स्क्लाइट डेटा प्रदाता अभी तक इसका समर्थन नहीं करता है .. अगर ऐसा होता है, तो मैं मेरी बुद्धि का अंत यह कैसे काम करता है .. – kaustubh

+0

@kaustubh: [dbFacade] (http://krez0n.org.ua/wp-content/uploads/files/dbFacade.zip) का उपयोग करने का प्रयास करें। शायद यह इसका समर्थन करता है? [ लेखक का ब्लॉग] (http://krez0n.org.ua/archives/84) दुर्भाग्य से रूसी में है (वह यूक्रेन से है, ऐसा लगता है), लेकिन मैं आपको – abatishchev

+0

का अनुवाद करने में मदद करने की कोशिश कर सकता हूं @kustubh: btw, क्या आप जोड़ा गया 'EnforceFKConstraints = Yes' या' EnforceFKConstraints = True' या 'EnforceFKConstraints = 1'। या उनमें से सभी एक बार में? – abatishchev

2

एक और समाधान प्रत्येक प्रश्न के साथ "PRAGMA विदेशी_की = चालू" करना है।

 
    SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbSQLite + ";Read Only=False;"); 
    connection.Open(); 
    SQLiteCommand mycommand = new SQLiteCommand(connection); 
    mycommand.CommandText = "PRAGMA foreign_keys=ON"; 
    mycommand.ExecuteNonQuery(); 
    mycommand.CommandText = "DELETE FROM table WHERE ID=x"; 
    mycommand.ExecuteReader(); 
    connection.Close(); 

यदि आप इसे एक फ़ंक्शन में डालते हैं जिसमें आप कमांडटेक्स्ट पास करते हैं तो आप इसका पुन: उपयोग कर सकते हैं।

3

मैं भी इस मुद्दे से जूझ रहा था। मैंने डेटाबेस से कनेक्ट करते समय SQLDriverConnect() में उत्पन्न पूर्ण कनेक्शन स्ट्रिंग की जांच करने का निर्णय लिया।

'Driver={SQLite3 ODBC Driver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD=' 

आप देख सकते हैं एक FKSupport संपत्ति है: यह यह क्या वापस लौटा है।

'Driver={SQLite3 ODBCDriver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=True;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD=' 

और देखा: मेरी कनेक्शन स्ट्रिंग को FKSupport=True; जोड़ने के बाद यह इस लौटाई गई! विदेशी कुंजी contants लागू कर रहे हैं।

-1
In C++ store app the following code helped me to enable PRAGMA foreign_keys 
sqlite3_stmt* stmt; 
sqlite3_prepare(db, "PRAGMA foreign_keys = ON;", -1, &stmt, 0); 
sqlite3_step(stmt); 

I called this after creating db using the call of 

int rc = sqlite3_open16(path->Data(), &db);