ВСТАВИТЬ с транзакцией и параметрами? - PullRequest
4 голосов
/ 05 марта 2010

Я изучаю VB.Net и мне нужно работать с базой данных SQLite, используя решение ADO.Net с открытым исходным кодом System.Data.SQLite

Примеры, которые я нашел в разделе HOWTO, есть только в C #. Будет ли у кого-нибудь простой пример в VB.Net, который я мог бы изучить, чтобы понять, как использовать транзакции при вставке нескольких параметров?

FWIW, вот код, над которым я работаю:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLite.SQLiteCommand
    Dim SQLtransaction As SQLite.SQLiteTransaction

    SQLconnect.ConnectionString = "Data Source=test.sqlite;"
    SQLconnect.Open()

    SQLcommand = SQLconnect.CreateCommand

    SQLcommand.CommandText = "CREATE TABLE IF NOT EXISTS files (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, hash TEXT);"
    SQLcommand.ExecuteNonQuery()

        '================ INSERT starts here
    SQLtransaction = SQLconnect.BeginTransaction()
    Dim myparam As New SQLite.SQLiteParameter()

    SQLcommand.CommandText = "INSERT INTO [files] ([name],[hash]) VALUES(?,?)"

    SQLcommand.Parameters.Add(myparam)

    'How to set all parameters? myparam.Value

    SQLcommand.ExecuteNonQuery()
    SQLtransaction.Commit()
        '================ INSERT ends here

    SQLcommand.CommandText = "SELECT id,name,hash FROM files"
    'How to tell if at least one row?
    Dim SQLreader As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
    While SQLreader.Read()
        ListBox1.Items.Add(SQLreader(1))
    End While

    SQLcommand.Dispose()
    SQLconnect.Close()
End Sub

Спасибо.


Редактировать: Для тех, кто заинтересован, вот рабочий код:

SQLtransaction = SQLconnect.BeginTransaction()
SQLcommand.CommandText = "INSERT INTO files (name,hash) VALUES(@name,@hash)"
SQLcommand.Parameters.AddWithValue("@name", "myfile")
SQLcommand.Parameters.AddWithValue("@hash", "123456789")
SQLcommand.ExecuteNonQuery()
SQLtransaction.Commit()

1 Ответ

0 голосов
/ 05 марта 2010

Транзакционный подход должен быть таким же (при условии, что SQLite API поддерживает транзакции.) Что касается нескольких параметров, вам необходимо объявить экземпляр класса SqlParameter для каждого параметра, а затем добавить каждый из них в запрос.

Dim myparam As New SQLite.SQLiteParameter()
myparam.Value = "Parameter 1's value"

Dim myparam2 As New SQLite.SQLiteParameter()
myparam2.Value = "Parameter 2's value"

SQLcommand.Parameters.Add(myparam)
SQLcommand.Parameters.Add(myparam2)

Что касается вашего вопроса «Как определить, есть ли хотя бы одна строка», стандартные .NET SQLReader имеют свойство «HasRows». т.е.

If SQLreader.HasRows Then
    While SQLreader.Read()
        ListBox1.Items.Add(SQLreader(1))
    End While
End If

Полагаю, что драйвер SQLlite должен.

Извините, если этот код не чистый VB, я не трогал его около 5 лет!

...