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