2Toad के जवाब ज्यादातर सही है, लेकिन मैं अपने खुद के जोड़ने के लिए क्योंकि वहाँ कुछ स्पष्टीकरण बनाया जा रहे हैं चाहता था। 2Toad के रूप में, यह सही है:
जब आप कनेक्शन स्ट्रिंग में कोई पासवर्ड निर्दिष्ट करते हैं, और डेटाबेस पहले से मौजूद है, SQLite मानता है कि डेटाबेस एन्क्रिप्ट किया गया है और इसे पासवर्ड के साथ डिक्रिप्ट करने का प्रयास करेगा। यदि आपने अभी तक डेटाबेस पर कोई पासवर्ड सेट नहीं किया है, तो इसका परिणाम "फ़ाइल एन्क्रिप्ट की गई" त्रुटि होगी, क्योंकि आपूर्ति किए गए पासवर्ड का उपयोग एक अनएन्क्रिप्टेड डेटाबेस को डिक्रिप्ट करने के लिए नहीं किया जा सकता है।
लेकिन इस त्रुटि भी अगर आप conn.SetPassword("something")
का उपयोग करने के बाद आप पहले से ही कनेक्शन स्ट्रिंग में एक और एक था कोशिश हो सकता है। या यदि आप conn.ChangePassword("somethingelse")
करते हैं, लेकिन कनेक्शन स्ट्रिंग में अभी भी Password=something
है।
कई परिदृश्य पर विचार करने के होते हैं:
- डेटाबेस पासवर्ड के लिए आवेदन किया था, और यह कनेक्शन स्ट्रिंग में है।
- आप कनेक्शन स्ट्रिंग में एक पासवर्ड है, लेकिन डेटाबेस एक लागू नहीं है, या स्ट्रिंग में पासवर्ड डीबी मेल नहीं खाता।
- डेटाबेस पासवर्ड के लिए किया था कभी नहीं किया है, और आप इसे बदलना चाहते हैं।
- डेटाबेस में एक पासवर्ड है, और आप इसे बदलना चाहते हैं।
संकल्प:
तो कोड 2Toad प्रदर्शन करने के लिए conn.ChangePassword("somethingelse")
केवल आधा सही है और खाता है, जहां आप कर रहे हैं पर ध्यान नहीं देता प्रदान की, और क्या आप किया है, और आप भविष्य में क्या करना चाहते हैं। यदि आपके पास कोई मौजूदा पासवर्ड है और आप इसे बदलना चाहते हैं, तो यह सही है, लेकिन आपको यह भी सुनिश्चित करना होगा कि बाद में कनेक्शन स्ट्रिंग अपडेट हो जाए, या बाद के कनेक्शन file is encrypted
त्रुटि के साथ विफल हो जाएंगे।
इस परिदृश्य होता है अगर आप खाली conn.SetPassword("")
और उसके बाद का उपयोग कर पासवर्ड पहला कनेक्शन स्ट्रिंग में Password=something
बिना डेटाबेस से कनेक्ट बिना conn.ChangePassword("somethingelse")
प्रयास करें। उस Password=something
को कनेक्शन स्ट्रिंग से हटा दिया जाना चाहिए, क्योंकि पासवर्ड को डीबी से प्रोग्रामेटिक रूप से हटा दिया गया है और डीबी उस से जुड़ने का प्रयास करेगा। यदि इसे किसी भी समय कनेक्शन स्ट्रिंग से हटाया नहीं जाता है, क्योंकि इसे डीबी प्रोग्रामेटिक रूप से हटा दिया जाता है, तो आपको वही file is encrypted
त्रुटि मिल जाएगी।
क्योंकि मैंने शुरुआत में conn.SetPassword("something")
कर शुरू किया था जब मेरे पास पासवर्ड लागू नहीं था (और मुझे विश्वास है कि यह ऐसा करने का तरीका है), मैं एक और SQLite डीबी बनाने के बिना निम्नलिखित को सत्यापित नहीं कर सकता, लेकिन मुझे विश्वास नहीं है कि अगर आप पहले स्थान पर कभी पासवर्ड नहीं रखते हैं तो आप conn.ChangePassword("something")
पर कॉल कर सकते हैं। प्रारंभिक सेट के लिए आपको conn.SetPassword("something")
करना चाहिए, और उसके बाद अपनी कनेक्शन स्ट्रिंग में Password=something
डालें।
तरह से मैं एक पासवर्ड बदलना किया था, जहां मैं केवल conn.SetPassword("")
कर रहे हैं और कनेक्शन स्ट्रिंग से Password=something
साफ करने के बाद conn.ChangePassword("somethingelse")
किया:
// Changes an encrypted database to unencrypted and removes password
string connString = "Data Source=c:\\test.db3;Password=something";
SQLiteConnection conn = new SQLiteConnection(connString);
conn.SetPassword("");
//conn.Open(); // doesn't work because connString hasn't been updated
// Update connString
connString = "Data Source=c:\\test.db3;";
conn = new SQLiteConnection(connString);
conn.Open(); // we've opened the DB without a password
// Re-encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.
conn.ChangePassword("somethingelse");
conn.Close();
// Update connString
connString = "Data Source=c:\\test.db3;Password=somethingelse";
conn = new SQLiteConnection(connString); // must re-instantiate!
conn.Open(); // we've opened the DB with our new password
यह बाहर काम ठीक। मैं तुम्हें भी कनेक्शन स्ट्रिंग से यह स्पष्ट नहीं कर सकते और बस conn.ChangePassword("somethingelse")
करते हैं, और उसके बाद अपने स्ट्रिंग के लिए Password=somethingelse
जोड़ने के लिए, बाद में लगता है:
// Opens an encrypted database
string connString = "Data Source=c:\\test.db3;Password=something";
SQLiteConnection conn = new SQLiteConnection(connString);
conn.Open();
// Encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.
conn.ChangePassword("somethingelse");
conn.Close();
// Update connString
connString = "Data Source=c:\\test.db3;Password=somethingelse";
conn = new SQLiteConnection(connString);
conn.Open(); // we've opened the DB with our new password
व्यक्तिगत रूप से, मैं पासवर्ड के रूप में एक एप्लिकेशन (वेब) में एन्क्रिप्टेड स्टोर .config फ़ाइल करें, और इसे मेरे एप्लिकेशन ऑनलोड में एक चर में कॉल करें और गतिशील रूप से इसकी कनेक्शन स्ट्रिंग बनाएं।
मुझे पता है कि यदि आप SQLite डीबी हटाते हैं और इसे कॉल करने का प्रयास करते हैं, तो आपको बस एक त्रुटि मिलेगी - आपके कनेक्शन स्ट्रिंग से एक नए पासवर्ड के साथ पुन: निर्मित SQLite DB नहीं - कम से कम उपयोग करते समय यह एक सी # .NET ऐप से है।
अद्यतन आप एक समारोह है कि पासवर्ड को अद्यतन करने के लिए इस्तेमाल किया जाएगा के बाद आपके पास पहले से की जरूरत है, आप नहीं .SetPassword()
, लेकिन .ChangePassword()
करना चाहते हैं। मैंने पाया कि यह हमेशा इसे खाली करने के लिए बेहतर है, फिर इसे बदलें, जैसे कि मेरे पहले उदाहरण में # 4 में।
+1, बहुत बहुत शुक्रिया यह काम कर रहा है, लेकिन केवल पहली बार यह दोषरहित काम किया, लेकिन यह इसे फिर से con.open पर एक ही अपवाद दिखा जब मैं आवेदन दूसरी बार चलने वाले "फाइल खोला है कि एक डेटाबेस फ़ाइल फ़ाइल नहीं है एन्क्रिप्टेड या डेटाबेस नहीं है " – Mogli
@harhar कृपया अपने डेटाबेस को एन्क्रिप्ट करने के लिए आपके द्वारा उठाए गए चरणों की रूपरेखा तैयार करें। यदि आपने 'चेंजपासवर्ड()' विधि का उपयोग किया है, तो आप उसे बाद की कॉल से हटाना चाहेंगे। Con.Open() के बाद – 2Toad
; मैं con लिखता हूँ।ChangePassword ("पासवर्ड"); और इसके साथ काम करने के बाद मैं con.ChangePassword (""); और अंत में con.Close(); क्या यह ग़लत है ? – Mogli