с SQLite не удается открыть файл базы данных зашифрован или не базы данных?

Я работаю над приложением Windows .net 2.0 с базой данных sqlite, моя строка подключения остается в приложении.config like

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

в строке подключения я определил пароль как "mypassword" если я удалю этот пароль, все работает хорошо, но когда я использую предложение password, это дает мне ошибку в подключении.открыть() синтаксис

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

Я искал в сети и нашел какую-то проблему с версией, но я использую версию 3 только так, как я сказал в строке подключения я также пробовал удалить "version=3", но проблема остается той же.

Я делаю это в первый раз, каково решение этого?

2 ответов


когда вы указываете пароль в строке подключения, и база данных уже существует, 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");

ссылки: шифрование, расшифровка и присоединение к зашифрованным базам данных


ответ 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("") а потом попробовать conn.ChangePassword("somethingelse") без предварительного подключения к базе данных без Password=something в строке подключения. Это Password=something должно быть удалено из строка подключения, потому что пароль был удален программно из БД, и БД попытается подключиться к нему. Если он не удаляется из строки подключения одновременно с программным удалением из БД, вы получите то же самое file is encrypted ошибка.

  3. потому что я начал с того, что сделал conn.SetPassword("something") в самом начале, когда у меня не было пароля применяется (и я считаю, что это способ сделать это), я не могу проверить без создание другой БД SQLite, но я не верю, что вы можете вызвать conn.ChangePassword("something") если у вас никогда не было пароля в первую очередь. Вы должны сделать conn.SetPassword("something") для начального набора, а затем положить Password=something в строке подключения.

  4. кстати я сделал смену пароля, где я сделал conn.ChangePassword("somethingelse") только после conn.SetPassword("") и очистив Password=something в строке подключения:

    // 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

лично я храню пароль как зашифрованный в приложении (веб) .конфигурационный файл и вызовите его в переменную в моем приложении onload и динамически создайте из него строку подключения.

что я знаю, если вы удалите SQLite DB и попытаетесь вызвать его, вы просто получите ошибку - не воссозданную SQLite DB с новым паролем из вашего соединения string-по крайней мере, при использовании и вызове его из приложения C# .NET.

обновление Если вам нужна функция, которая будет использоваться для обновления пароля после того, как у вас уже есть один, вы не хотите иметь .SetPassword(), а .ChangePassword(). Я обнаружил, что также лучше всегда вычеркивать его, а затем изменять, как в моем первом примере в #4.