.NET: не заставить работать базу данных SQLite в памяти - PullRequest
0 голосов
/ 31 октября 2018

Пытаясь понять использование баз данных 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 голосов
/ 31 октября 2018

В COUNT sql вы забыли изменить CommandText, поэтому вы снова вставили запись.

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

По этой причине рекомендуется использовать несколько команд для разных запросов.

Sidenote: вы должны использовать выражение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...