2013-04-16 6 views
11

मैं SQLite डेटाबेस के साथ एक खिड़कियों आवेदन .net 2.0 पर काम कर रहा हूँ, मेरे कनेक्शन स्ट्रिंग की तरहsqlite डेटाबेस फ़ाइल खोलने में असमर्थ है एन्क्रिप्टेड है या डेटाबेस नहीं है?

<connectionStrings> 
<add name="SQLiteDB" 
    connectionString="Data Source=|DataDirectory|database.s3db;version=3;password=mypassword;" 
    providerName="System.Data.Sqlite"/> 
</connectionStrings> 

app.config में रहता है कनेक्शन स्ट्रिंग मैं के रूप में "mypassword" पासवर्ड को परिभाषित किया है अगर मैं इस पासवर्ड सब कुछ को हटाने में अच्छी तरह से काम कर रहा है, लेकिन जब मैं पासवर्ड खंड का उपयोग करें, यह मुझे connection.open में त्रुटि देता है() सिंटैक्स

File opened that is not a database file 
file is encrypted or is not a database 

मैं नेट पर खोज की है और कुछ संस्करण मुद्दा मिल गया, लेकिन मैं संस्करण 3 का उपयोग कर रहा केवल के रूप में मैं संबंध में कहा गया है स्ट्रिंग मैंने "संस्करण = 3" को हटाने का भी प्रयास किया लेकिन समस्या वही बना रही है।

मैं यह पहली बार कर रहा हूँ, इसके बारे में समाधान क्या है?

उत्तर

7

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

आप या तो डेटाबेस हटा सकते हैं, और SQLite एक नया एन्क्रिप्टेड डेटाबेस कनेक्शन स्ट्रिंग में पासवर्ड का उपयोग कर पैदा करेगा। या, आप अपने मौजूदा डेटाबेस ChangePassword() पद्धति का उपयोग करके एन्क्रिप्ट कर सकते हैं:

// Opens an unencrypted database  
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");  
cnn.Open();  

// Encrypts the database. The connection remains valid and usable afterwards.  
cnn.ChangePassword("mypassword"); 

संदर्भ: Encrypting, decrypting and attaching to encrypted databases

+0

+1, बहुत बहुत शुक्रिया यह काम कर रहा है, लेकिन केवल पहली बार यह दोषरहित काम किया, लेकिन यह इसे फिर से con.open पर एक ही अपवाद दिखा जब मैं आवेदन दूसरी बार चलने वाले "फाइल खोला है कि एक डेटाबेस फ़ाइल फ़ाइल नहीं है एन्क्रिप्टेड या डेटाबेस नहीं है " – Mogli

+1

@harhar कृपया अपने डेटाबेस को एन्क्रिप्ट करने के लिए आपके द्वारा उठाए गए चरणों की रूपरेखा तैयार करें। यदि आपने 'चेंजपासवर्ड()' विधि का उपयोग किया है, तो आप उसे बाद की कॉल से हटाना चाहेंगे। Con.Open() के बाद – 2Toad

+0

; मैं con लिखता हूँ।ChangePassword ("पासवर्ड"); और इसके साथ काम करने के बाद मैं con.ChangePassword (""); और अंत में con.Close(); क्या यह ग़लत है ? – Mogli

2

2Toad के जवाब ज्यादातर सही है, लेकिन मैं अपने खुद के जोड़ने के लिए क्योंकि वहाँ कुछ स्पष्टीकरण बनाया जा रहे हैं चाहता था। 2Toad के रूप में, यह सही है:

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

लेकिन इस त्रुटि भी अगर आप conn.SetPassword("something") का उपयोग करने के बाद आप पहले से ही कनेक्शन स्ट्रिंग में एक और एक था कोशिश हो सकता है। या यदि आप conn.ChangePassword("somethingelse") करते हैं, लेकिन कनेक्शन स्ट्रिंग में अभी भी Password=something है।

कई परिदृश्य पर विचार करने के होते हैं:

  1. डेटाबेस पासवर्ड के लिए आवेदन किया था, और यह कनेक्शन स्ट्रिंग में है।
  2. आप कनेक्शन स्ट्रिंग में एक पासवर्ड है, लेकिन डेटाबेस एक लागू नहीं है, या स्ट्रिंग में पासवर्ड डीबी मेल नहीं खाता।
  3. डेटाबेस पासवर्ड के लिए किया था कभी नहीं किया है, और आप इसे बदलना चाहते हैं।
  4. डेटाबेस में एक पासवर्ड है, और आप इसे बदलना चाहते हैं।

संकल्प:

  1. तो कोड 2Toad प्रदर्शन करने के लिए conn.ChangePassword("somethingelse") केवल आधा सही है और खाता है, जहां आप कर रहे हैं पर ध्यान नहीं देता प्रदान की, और क्या आप किया है, और आप भविष्य में क्या करना चाहते हैं। यदि आपके पास कोई मौजूदा पासवर्ड है और आप इसे बदलना चाहते हैं, तो यह सही है, लेकिन आपको यह भी सुनिश्चित करना होगा कि बाद में कनेक्शन स्ट्रिंग अपडेट हो जाए, या बाद के कनेक्शन file is encrypted त्रुटि के साथ विफल हो जाएंगे।

  2. इस परिदृश्य होता है अगर आप खाली conn.SetPassword("") और उसके बाद का उपयोग कर पासवर्ड पहला कनेक्शन स्ट्रिंग में Password=something बिना डेटाबेस से कनेक्ट बिना conn.ChangePassword("somethingelse") प्रयास करें। उस Password=something को कनेक्शन स्ट्रिंग से हटा दिया जाना चाहिए, क्योंकि पासवर्ड को डीबी से प्रोग्रामेटिक रूप से हटा दिया गया है और डीबी उस से जुड़ने का प्रयास करेगा। यदि इसे किसी भी समय कनेक्शन स्ट्रिंग से हटाया नहीं जाता है, क्योंकि इसे डीबी प्रोग्रामेटिक रूप से हटा दिया जाता है, तो आपको वही file is encrypted त्रुटि मिल जाएगी।

  3. क्योंकि मैंने शुरुआत में conn.SetPassword("something") कर शुरू किया था जब मेरे पास पासवर्ड लागू नहीं था (और मुझे विश्वास है कि यह ऐसा करने का तरीका है), मैं एक और SQLite डीबी बनाने के बिना निम्नलिखित को सत्यापित नहीं कर सकता, लेकिन मुझे विश्वास नहीं है कि अगर आप पहले स्थान पर कभी पासवर्ड नहीं रखते हैं तो आप conn.ChangePassword("something") पर कॉल कर सकते हैं। प्रारंभिक सेट के लिए आपको conn.SetPassword("something") करना चाहिए, और उसके बाद अपनी कनेक्शन स्ट्रिंग में Password=something डालें।

  4. तरह से मैं एक पासवर्ड बदलना किया था, जहां मैं केवल 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 में।

+0

ऊपर वर्णित सभी चार परिदृश्य बहुत आत्म-स्पष्टीकरणपूर्ण हैं ... वास्तव में मुझे इसकी आवश्यकता है .... यह बहुत अच्छी व्याख्या थी। धन्यवाद उपरोक्त :) – Mogli

+0

@Mogli, धन्यवाद। मैंने "बस कोशिश करने के लिए-द-द-द-डॉन-चीज-टू-वर्क" की गर्मी में सोचा, मैंने सोचा कि दिए गए परिदृश्यों के साथ एक व्यापक चेकलिस्ट बेहतर था "बस" करने के बजाय, बस इतना करना "एक्स" आपको परेशानी में डाल सकता है अगर आप वास्तव में क्या करने की कोशिश कर रहे हैं उस पर ध्यान नहीं दे रहे हैं, तो आपकी वास्तविक परिस्थिति को देखते हुए। :) – vapcguy

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