代码之家  ›  专栏  ›  技术社区  ›  MaQleod

在vb.net中的sqlite,即使它存在也找不到表

  •  2
  • MaQleod  · 技术社区  · 17 年前

    我正在使用以下代码(在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()
    

    我收到一个错误,说它找不到表“entries” 我知道这个表存在,因为我可以通过sqlite和autoit通过命令行写入它,当我打开数据库时,可以在sqlite浏览器中看到它并对其进行编辑。我不明白为什么vb看不到它(我知道它可以看到并打开数据库文件)。有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   James Anderson    17 年前

    最有可能的问题是相对路径(目录)。

    如果数据库文件不存在,则SQLite将创建该文件,因此您将永远不会收到“找不到数据库文件”消息。错误路径的第一个指示是“表丢失”。

    我个人的经验是,尽管这违背了我的程序员的直觉,但总是使用一个绝对(完全限定的)路径/文件名作为sqlite数据库。

    如果你把文件放在完整的位置,比如“/var/myapp/vault.db”,你应该没问题。 如果这很容易在存储区中移动,从属性/config文件中选取文件名--“config file not found”比“table not found”更容易处理。

        2
  •  3
  •   Joel Coehoorn    17 年前

    啊! 这个代码有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 .

        3
  •  0
  •   Tyler W. Cox    14 年前

    我有一个与sqlite(via.net)类似的错误,它拒绝相信表存在,即使直接访问确认表存在。该错误只能在一台机器上产生,而不能在其他机器上产生。硬编码路径似乎无法解决问题。修复方法是以管理员身份运行程序,或者将数据库文件更改为对所有人都可用。显然,当实际问题是访问限制时,.NET程序集会引发一个缺少表的错误。

    推荐文章