Соединение C # Sqlite не прерывается при неверном пароле

1

Вот как я создаю базу данных и добавляю пароль:

        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. У меня есть Visual Studio Express 2013.

Реальная проблема заключается в том, что когда я делаю запрос, он говорит, что я зашифрован, или это не база данных, но почему она проходит, чтобы попытаться поймать?

На веб-сайте Sqlite он сообщает, что если это неправильно, он не должен соединяться.

  • 1
    Какую библиотеку вы используете? .NET не поддерживает SQLite без сторонних API, поэтому ваше утверждение «Веб-сайт Sqlite сообщает, что в случае ошибки он не должен подключаться». не полезно, потому что это поведение зависит от реализации API.
  • 0
    Поставщик данных ADO.NET для SQLite версии 1.0.94.0.
Показать ещё 4 комментария
Теги:
sqlite3

2 ответа

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;
}
  • 0
    Да, я сделал то же самое, но с выбранной версией sqlite, и это сработало. Тем не менее я не понимаю, почему это делает вас связь, если это неправильно. Спасибо.
-2

Согласно документации 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, Open и StateChange. Вы также должны предоставить следующие свойства: ConnectionString, Database, DataSource, ServerVersion и State.

В DbConnection.Open документация MSDN гласит:

Открывает соединение с базой данных с настройками, заданными ConnectionString.

Таким образом, разработчикам имеет смысл проверять только пароль, когда вы действительно открываете dbconnection. Не в конструкторе.

  • 0
    Хорошо, так что все еще у меня есть dbconnection.Open () в попытке поймать. Почему тогда открывается соединение?
  • 0
    Вы действительно можете получить данные из базы данных? Возможно, некоторые из ваших предположений неверны (база данных имеет пароль, она нашла базу данных, база данных не пуста или база данных была правильно сохранена с помощью кода, который вы использовали для ее создания).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню