sqlite无法打开数据库文件是加密的还是不是数据库?

时间:2013-04-16 06:53:50

标签: c# winforms visual-studio-2010 sqlite

我正在使用带有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>

在连接字符串中,我已将密码定义为“mypassword”,如果我删除此密码,一切正常,但是当我使用密码子句时,它在connection.open()语法中给出错误

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

我在网上搜索并发现了一些版本问题,但我只使用版本3,因为我在连接字符串中说明我也尝试删除“version = 3”但问题仍然相同。

我是第一次这样做,它的解决方案是什么?

3 个答案:

答案 0 :(得分:10)

当您在连接字符串中指定密码并且数据库已存在时,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

答案 1 :(得分:2)

2Toad的答案大多是正确的,但我想加我自己的,因为有一些澄清要做。正如2Toad所说,这是正确的:

在连接字符串中指定密码并且数据库已存在时,SQLite会假定数据库已加密,并尝试使用所述密码对其进行解密。如果您还没有在数据库上设置密码,这将导致&#34;文件被加密&#34;错误,因为提供的密码不能用于解密未加密的数据库。

但是,如果在连接字符串中已有另一个conn.SetPassword("something")之后尝试使用conn.ChangePassword("somethingelse"),也会发生此错误。或者,如果您执行Password=something,但在连接字符串中仍然有conn.ChangePassword("somethingelse")

有几种情况需要考虑:

  1. 数据库已应用密码,并且位于连接字符串中。
  2. 您在连接字符串中有密码,但数据库没有应用密码,或者字符串中的密码与数据库不匹配。
  3. 数据库从未有过密码,您想要更改密码。
  4. 数据库有密码,您想要更改它。
  5. 分辨率:

    1. 因此,为执行file is encrypted而提供的代码2Toad只有一半是正确的,并没有考虑到您的位置,您做了什么,以及您想要做什么做到了。如果您有现有密码并且想要更改它,这是正确的,但您还必须确保之后更新连接字符串,否则后续连接将因conn.SetPassword("")错误而失败。

    2. 如果您使用conn.ChangePassword("somethingelse")清空密码,然后尝试Password=something而没有首先连接到数据库而没有连接字符串中的Password=something,则会出现这种情况。必须从连接字符串中删除file is encrypted,因为密码已经从DB中以编程方式删除,并且DB将尝试连接该密码。如果在以编程方式从数据库中删除连接字符串的同时未将其从连接字符串中删除,则会出现相同的conn.SetPassword("something")错误。

    3. 因为我刚开始做conn.ChangePassword("something"),当时我没有申请密码(而且我相信这是这样做的方式),我无法验证以下没有创建另一个SQLite数据库,但如果你从来没有密码,我不相信你可以调用conn.SetPassword("something")。您应该为初始设置Password=something,然后将conn.ChangePassword("somethingelse")放入您的连接字符串中。

    4. 我更改密码的方式是仅在执行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")
    5. 这很好。我想您也无法从连接字符串中清除它,只需执行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 添加到您的字符串中,之后:

      .SetPassword()

      就个人而言,我将密码以加密方式存储在app(web).config文件中,并将其调用到我的应用程序onload中的变量中,并从中动态构建我的连接字符串。

      我知道,如果你删除一个SQLite数据库并尝试调用它,你只会得到一个错误 - 不是用连接字符串中的新密码重新创建的SQLite数据库 - 至少在使用和调用它时来自C#.NET应用程序。

      更新如果您需要一个可用于更新密码的功能,您不希望拥有.ChangePassword(),但{{1} }。我发现最好总是将其删除,然后更改它,就像我在#4中的第一个例子一样。

答案 2 :(得分:0)

检查SQLite的版本。某些数据库只能由sqlite3打开。