我正在使用以下代码(VB.net中的System.Data.SQLite):
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看不到它(我知道它看到并打开数据库文件就好了)。有什么想法吗?
答案 0 :(得分:4)
最有可能的问题是相对路径(目录)。
如果sqlite不存在,它将创建一个数据库文件,因此您永远不会得到“db file not found”消息。错误路径的第一个指示是“表缺失”。
我个人的经验是,虽然它违背了程序员的本能,但总是使用sqlite数据库的绝对(完全限定的)路径/文件名。
如果您输入“/var/myapp/vault.db”这样的完整文件位置,那么您应该没问题。 如果有可能在商店中移动从属性/配置文件中获取文件名 - '找不到配置文件'比“找不到表”更容易处理。
答案 1 :(得分:3)
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中哈希值并在存储或比较密码之前对密码进行哈希处理的信息。
完成后重新测试代码,看看是否仍然像以前一样报告相同的错误。我们需要确保这不能解决问题或引入新的东西。然后我们可以通过检查您的connection string来开始解决丢失的表格问题。
答案 2 :(得分:0)
我有一个类似的错误,SQLite(通过.Net)拒绝相信该表存在,即使直接访问确认它在那里。错误只能在一台机器上生成,而不能在其他机器上生成。硬编码路径似乎没有解决问题。修复程序要么以管理员身份运行程序,要么将DB文件更改为可供Everyone使用。显然,当实际问题是访问限制时,.Net程序集会引发一个丢失的表错误。