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