首页 > 解决方案 > .NET:不要让 SQLite 内存数据库工作

问题描述

为了了解内存中 SQLite 数据库的使用,我在 SQLite 文档中阅读了有关它的内容,并且(我认为)我在 stackoverflow 中可以找到的几乎所有内容。

我想将本地数据库中的表复制到内存数据库中。

为了了解 SQLite 内存数据库的工作原理,我创建了以下代码:

Private Sub Test()
  Dim intTemp As Integer
  Dim strSQL As String

  Dim conn As New SQLiteConnection("Data Source=':memory:';Version=3;New=True;")
  conn.Open()

  strSQL = "CREATE TABLE Table_1 (Table_1ID [VARCHAR(5)] NOT NULL, Item [VARCHAR(40)]);"
  Dim cmd As SQLiteCommand = New SQLiteCommand(strSQL) With {
      .Connection = conn
    }

  strSQL = "SELECT Count(*) FROM Table_1;"
  ' Test (1): Result: 0
  intTemp = cmd.ExecuteScalar

  strSQL = "INSERT INTO Table_1 (Table_1ID, Item) VALUES ('1000', 'Book');"
  cmd.CommandText = strSQL
  ' Test (2): Result: 1
  intTemp = cmd.ExecuteNonQuery

  strSQL = "SELECT Count(*) FROM Table_1;"
  ' Test (3): Result: 0
  intTemp = cmd.ExecuteScalar
End Sub

它似乎以某种方式起作用:当我将记录插入表中时,结果为 1。但是当我计算记录时,结果为 0。

知道我在这里做错了什么吗?在 C# 或 VB.Net 中是否有任何工作示例?也许甚至可以解决我最初的问题:将表从本地数据库复制到内存数据库中?谢谢!

标签: vb.netsqlite

解决方案


COUNTsql中你忘记改了CommandText,所以又插入了一条记录。

strSQL = "SELECT Count(*) FROM Table_1;"
cmd.CommandText = strSQL             ' this was missing   '
intTemp = CInt(cmd.ExecuteScalar())  ' Now this returns 1 '

出于这个原因,对不同的查询使用多个命令是个好主意。

旁注:您应该Using对使用非托管资源的对象使用 -statement。在连接的情况下,即使在出现错误的情况下,它也会在处理之前关闭它:

Using conn = New SQLiteConnection("Data Source=':memory:';Version=3;New=True;")
    conn.Open()

    Using cmd = New SQLiteCommand("CREATE TABLE Table_1 (Table_1ID [VARCHAR(5)] NOT NULL, Item [VARCHAR(40)]);", conn)
        cmd.ExecuteNonQuery()

        cmd.CommandText = "INSERT INTO Table_1 (Table_1ID, Item) VALUES ('1000', 'Book');"
        Dim inserted as Int32 = cmd.ExecuteNonQuery()

        cmd.CommandText = "SELECT Count(*) FROM Table_1;"
        Dim count = CInt(cmd.ExecuteScalar())
    End Using       
End Using

推荐阅读