这就是我创建数据库并输入密码的方法:
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网站上可以看出,如果错误则不应该连接。
答案 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时检查密码是有意义的。不在构造函数中。