sqlite в vb.net, не могу найти таблицу, даже если она существует - PullRequest
2 голосов
/ 11 мая 2009

Я использую следующий код (System.Data.SQLite в VB.net):

        Dim SQLconnect As New SQLite.SQLiteConnection()
        Dim SQLcommand As SQLiteCommand
        SQLconnect.ConnectionString = "Data Source=vault.db;"
        SQLconnect.Open()
        SQLcommand = SQLconnect.CreateCommand
        SQLcommand.CommandText = "INSERT INTO entries VALUES ('" & appinput.Text & "','" & userinput.Text & "','" & passinput.Text & "')"
        SQLcommand.ExecuteNonQuery()
        SQLcommand.Dispose()
        SQLconnect.Close()
        Me.Hide()

Я получаю сообщение об ошибке, в котором говорится, что не может найти таблицу "записи" Я знаю, что таблица существует, потому что я могу писать в нее через командную строку через sqlite и через Autoit, а также просматривать и редактировать ее в браузере SQLite при открытии базы данных. Я не понимаю, почему VB не может видеть это (я знаю, что он видит и открывает файл базы данных очень хорошо). Есть идеи?

Ответы [ 3 ]

4 голосов
/ 11 мая 2009

Скорее всего, ваша проблема связана с относительными путями (каталогами).

sqlite создаст файл базы данных, если он не существует, поэтому вы никогда не получите сообщение «db file not found». Первым указанием неверного пути является «таблица отсутствует».

Мой личный опыт показывает, что, хотя это противоречит моему инстинкту программистов, всегда использовать абсолютный (полностью определенный) путь / имя файла для базы данных sqlite.

Если вы указали полное местоположение файла, например "/var/myapp/vault.db", у вас все будет в порядке. Если это удобно перемещаться по магазину, выберите имя файла из файла свойств / конфигурации - с «конфигурационным файлом не найден» гораздо проще разобраться, чем с «таблицей не найден».

3 голосов
/ 11 мая 2009

Argh! В этом коде есть 3 больших проблемы. Пожалуйста, обновите его так, чтобы исправить два из них:

Using cn As New SQLite.SQLiteConnection("Data Source=vault.db;"), _
      cmd As New SQLiteCommand("INSERT INTO entries VALUES (@AppInput, @UserInput, @PassInput)", cn)

    cmd.Parameters.AddWithValue("@AppInput", appinput.Text);
    cmd.Parameters.AddWithValue("@UserInput", userinput.Text);
    cmd.Parameters.AddWithValue("@PassInput", passinput.Text);

    cn.Open()
    cmd.ExecuteNonQuery()
End Using

Это предотвратит внедрение sql путем параметризации вашего запроса вместо прямой подстановки значений и предотвратит проблемы с блокировкой БД, убедившись, что ваше соединение расположено правильно, даже если выдается исключение.

Третья проблема заключается в том, что вы должны НИКОГДА хранить текстовые пароли в вашей базе данных (или где-либо еще в этом отношении). Прочтите о том, как хэшировать значения в .Net, хешировать и вводить пароль, прежде чем сохранять или сравнивать его.

После того, как вы сделали это, еще раз протестируйте свой код, чтобы убедиться, что вы по-прежнему получаете те же ошибки, что и раньше. Нам нужно убедиться, что это не решит проблему или не введет что-то новое. Затем мы можем приступить к решению проблемы отсутствующей таблицы, возможно, проверив вашу строку соединения .

0 голосов
/ 17 сентября 2011

У меня была похожая ошибка, когда SQLite (через .Net) отказывался верить, что таблица существует, хотя прямой доступ подтвердил ее наличие. Ошибка может быть выдана только на одной отдельной машине, а не на других. Жесткое кодирование пути, похоже, не решило проблему. Исправление состояло в том, чтобы запустить программу от имени администратора или изменить файл БД, чтобы он был доступен каждому. По-видимому, сборка .Net вызывает ошибку отсутствующей таблицы, когда фактической проблемой являются ограничения доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...