.NET:不要让SQLite内存数据库正常工作

时间:2018-10-31 12:46:18

标签: vb.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中是否有任何可行的示例?甚至可以解决我最初的问题:将表从本地数据库复制到内存数据库中?谢谢!

1 个答案:

答案 0 :(得分:3)

COUNT sql中,您忘记更改CommandText,因此您再次插入了一条记录。

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

因此,最好对不同的查询使用多个命令。

旁注:对于使用非托管资源的对象,应使用Using语句。如果有连接,即使在发生错误的情况下,它也将在连接之前将其关闭:

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