Mog*_*gli 14 c# sqlite visual-studio-2010 winforms
我正在使用sqlite数据库的Windows应用程序.net 2.0,我的连接字符串保持在app.config之类
<connectionStrings>
<add name="SQLiteDB"
connectionString="Data Source=|DataDirectory|database.s3db;version=3;password=mypassword;"
providerName="System.Data.Sqlite"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
在连接字符串中,我已将密码定义为"mypassword",如果我删除此密码一切正常,但是当我使用密码子句时,它给出了connection.open()语法错误
File opened that is not a database file
file is encrypted or is not a database
Run Code Online (Sandbox Code Playgroud)
我在网上搜索并发现了一些版本问题,但我只使用版本3,因为我在连接字符串中说明我也尝试删除"版本= 3"但问题仍然是相同的.
我是第一次这样做,它的解决方案是什么?
2To*_*oad 11
当您在连接字符串中指定密码并且数据库已存在时,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");
Run Code Online (Sandbox Code Playgroud)
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")因为我一开始就在没有应用密码的情况下执行了 a (我相信这是这样做的方法),所以如果不创建另一个 SQLite DB,我无法验证以下内容,但我不相信你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
Run Code Online (Sandbox Code Playgroud)这效果很好。我想您也可以不从连接字符串中清除它,只需执行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
Run Code Online (Sandbox Code Playgroud)
就个人而言,我将密码加密存储在应用程序 (web) .config 文件中,并将其调用到应用程序加载中的变量中,并从中动态构建连接字符串。
据我所知,如果您删除 SQLite DB 并尝试调用它,您只会收到错误 - 不是使用连接字符串中的新密码重新创建的 SQLite DB - 至少在使用 C# 并调用它时.NET应用程序。
UPDATE如果您需要一个在已有密码后用于更新密码的函数,那么您不想拥有.SetPassword(), 但是.ChangePassword()。我发现最好总是将其空白,然后更改它,就像我在#4 中的第一个示例一样。
| 归档时间: |
|
| 查看次数: |
28728 次 |
| 最近记录: |