密码错误时C#Sqlite连接不会失败

时间:2014-12-09 23:15:25

标签: c# sqlite

这就是我创建数据库并输入密码的方法:

        SQLiteConnection.CreateFile(filePath + "/" + username + ".sqlite");
        dbconnection = new SQLiteConnection("Data Source=" + filePath + "/" + username + ".sqlite;Version=3;");
        dbconnection.Open();      
        dbconnection.ChangePassword(password);
        sychroniseDb("Create");

这是我检查我是否可以连接到数据库的方式:

    try{
       dbconnection = new SQLiteConnection("Data Source=" + filePath + "\\" + username + ".sqlite;Version=3; Password=" + password + ";");
                        localDbConnected = true;
                        dbconnection.Open();
                        return true;
    }
                    catch
                    {
                        MessageBox.Show("User or password incorrect");
                        localDbConnected = false;
                        return false;
                    }

这件事的问题在于,即使密码错误,它仍然会通过Try并不会进入Catch甚至打开连接。这些dll来自Nuget Packages。我有Visual Studio Express 2013.

真正的问题是,当我进行查询时,它告诉我是加密的还是它不是数据库但是为什么它通过了尝试catch?

从Sqlite网站上可以看出,如果错误则不应该连接。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。要抛出异常必须做一些命令。请尝试以下代码:

try
{
    var dbPath = Path.Combine(filePath, (username + ".sqlite"));
    var csb = new SQLiteConnectionStringBuilder { DataSource = dbPath, Version = 3, Password = password };
    dbconnection = new SQLiteConnection(csb.ConnectionString);      
    dbconnection.Open();
    //COMMENT: Any command to check whether the database is encrypted
    using (SQLiteCommand command = new SQLiteCommand("PRAGMA schema_version;", dbconnection))
    {
        var ret = command.ExecuteScalar();
    }       
    localDbConnected = true;
    return true;
}
catch(SQLiteException)
{
    MessageBox.Show("User or password incorrect");
    localDbConnected = false;
    return false;
}

答案 1 :(得分:-1)

根据System.Data.SQLite文档,SQLiteConnection实现了System.Common.DbConnection。

SQLite implentation of DbConnection.

For a list of all members of this type, see SQLiteConnection Members .

System.Object    MarshalByRefObject
      Component
         DbConnection
            SQLiteConnection

public sealed class SQLiteConnection : DbConnection, ICloneable

MSDN文档声明:

  

对继承者的说明从DbConnection继承时,必须这样做   覆盖以下成员:Close,BeginDbTransaction,   ChangeDatabase,CreateDbCommand,打开和StateChange。你必须   还提供以下属性:ConnectionString,Database,   DataSource,ServerVersion和State。

在DbConnection上。打开MSDN文档说明:

  

使用指定的设置打开数据库连接   的ConnectionString。

因此,实际应用程序只在实际打开dbconnection时检查密码是有意义的。不在构造函数中。