Visual Basic und SQLite?

lord_fritte

Vice Admiral Special
Mitglied seit
28.08.2005
Beiträge
959
Renomée
1
Hallo ich bastel jetzt ein bisschen mit SQLite und Visual Basic .Net 2005.
Ich habe eine Datenbank mit einer Tabelle:
Code:
Settings:
SettingID: | SettingName: | SettingValue:
-----------------------------------------
     1     |    test1     |    Wert 1
     2     |    test2     |    Wert 2
     3     |    test3     |    Wert 3

Das Auslesen geht ja eigentlich wunderbar:
Code:
Module Module1

    Sub Main()
        Try
            Dim sqlConnect = New SQLiteConnection("Data Source=Database.db3")
            sqlConnect.Open()

            Dim sqlCommand = New SQLiteCommand()
            sqlCommand.Connection = sqlConnect

            sqlCommand.CommandText = "SELECT * from Settings"
            Dim sqlRead = sqlCommand.ExecuteReader()
            While (sqlRead.Read())
                Console.WriteLine("SettingID: {0}, SettingName: {1}, SettingValue: {2} ", sqlRead.GetValue(0), sqlRead.GetValue(1), sqlRead.GetValue(2))
            End While
            sqlRead.Close()

            sqlConnect.Close()
            Console.ReadLine()
        Catch e As Exception
            Console.WriteLine("Fehlermeldung: {0}", e.Message)
        End Try
    End Sub

End Module

Aber wie siehts mit den Befehlen INSERT, UPDATE, DELETE aus? ich habe schon alles mögliche versucht die befehle da einzubauen aber da passiert reingar nix, es wird nichts hinzugefügt, nichts gelöscht und nichts geändert.

Also wie muss ich die befehle dort einbauen?
Ich habe es schon so versucht, aber das geht nicht:
Code:
Module Module1

    Sub Main()
        Try
            Dim sqlConnect = New SQLiteConnection("Data Source=Database.db3")
            sqlConnect.Open()

            Dim sqlCommand = New SQLiteCommand()
            sqlCommand.Connection = sqlConnect

           sqlCommand.CommandText = "UPDATE from Settings SET SettingValue='Blabla' WHERE SettingName='test2'"

            Console.ReadLine()
        Catch e As Exception
            Console.WriteLine("Fehlermeldung: {0}", e.Message)
        End Try
    End Sub

End Module
 
Du hast nen Syntaxfehler in Deiner SQL-Query.

Die Syntax für UPDATE lautet:
Code:
UPDATE Tabelle SET Spalte1 = 'Wert1', Spalte2 = 'Wert2' WHERE Bedingung
für INSERT:
Code:
INSERT INTO Tabelle SET Spalte1 = 'Wert1', Spalte2 = 'Wert2'
oder
Code:
INSERT INTO Tabelle (Spalte1, Spalte2) VALUES ('Wert1', 'Wert2')
für DELETE:
Code:
DELETE FROM Tabelle WHERE Bedingung

Außerdem führst Du Deine Update-Query nicht aus. Da fehlt ein sqlCommand.ExecuteReader() oder sqlCommand.ExecuteNonQuery().
 
Danke, es geht, ich hätte aber auch selber drauf kommen können das da ein ExecuteNonQuery() fehlte.
.
EDIT :
.

Aber ist es nicht möglich bei sqlRead.GetValue(0) anstatt die indexnummer der spalte den namen der spalte anzugeben?
 
Zuletzt bearbeitet:
Aber ist es nicht möglich bei sqlRead.GetValue(0) anstatt die indexnummer der spalte den namen der spalte anzugeben?
Probiers spaßeshalber einfach mal. Ich nutze MySQL statt SQLite und deshalb etwas andere Klassen, aber mit denen gehts. Die Chancen stehen also nicht schlecht. Das müsste dann wohl so aussehen: sqlRead.GetValue("Spalte1").
 
Nee dann gibt er einen Fehler das er das nicht zum Integer Konvertieren kann. Ich habe es jetzt einfach mit einer Funktion und einer Case-Anwendung gemacht.
 
btw, gib deine benutzen Ressourcen mit Dispose wieder frei, sonst hast du Speicherlücken.
 
btw, gib deine benutzen Ressourcen mit Dispose wieder frei, sonst hast du Speicherlücken.
Sicher? Dispose ist doch eigentlich nur dazu da, der Garbage Collection unter die Arme zu greifen. Sprich: Man kann Dispose aufrufen, um die Ressourcen sofort freizugeben, aber wenn man es nicht tut, tuts später eben die Garbage Collection.
 
nope, der GC ruft nie Dispose auf, das muss man selber machen, es sei denn man packt es in den Finalizer, aber das ist Mist, da man nie sagen kann wann und ob der aufgerufen wird. Und unmanged Res. sind kostbar, also immer mit Dispose wieder freigeben.

unter C# nimmst du einfach

Code:
using(SQLiteConnection sqlConnect = new SQLiteConnection("Data Source=Database.db3"))
{
}<- Am Ende wird Dispose automatisch aufgerufen und du musst dir keinen Kopf machen, aber der VB Mist kennt das ja nicht, also muss man selber ran :]
 
Warum funktionieren Boolean werte aus der Datenbank nicht?
Das erste Feld was ich habe, hat den Typ Boolean
Code:
While (sqlRead.Read())
            If sqlRead(0) Then
                checkHideInTray.Checked = True
                MessageBox.Show("Ja")
            Else
                checkHideInTray.Checked = False
                MessageBox.Show("Nein")
            End If
        End While
Und egal was als Wert drin steht es kommt immer die Message box mit Nein.
 
nope, der GC ruft nie Dispose auf, das muss man selber machen, es sei denn man packt es in den Finalizer, aber das ist Mist, da man nie sagen kann wann und ob der aufgerufen wird. Und unmanged Res. sind kostbar, also immer mit Dispose wieder freigeben.
Hmm, okay, und wie verhält sich das bei folgendem Code?
Code:
// command ist ein MySqlCommand-Objekt
using(MySqlDataReader reader = command.ExecuteReader()) {
  ...
  // anderer Command
  reader = command.ExecuteReader();
  ...
}
Müsste ich da reader.Dispose() aufrufen bevor ich die Variable wiederverwende?

/edit: BTW, folgendes steht im MSDN:
The following rules outline the usage guidelines for the Dispose method
(...)
Do not assume that Dispose will be called. Unmanaged resources owned by a type should also be released in a Finalize method in the event that Dispose is not called.
(...)
 
Ich finde Visual Basic eigentlich ganz OK, ich habe damals mal mit C++ angefangen aber wo ich Windows Fenster Programmieren wollte habe ich es sein lassen.
 
Hmm, okay, und wie verhält sich das bei folgendem Code?
Code:
// command ist ein MySqlCommand-Objekt
using(MySqlDataReader reader = command.ExecuteReader()) {
  ...
  // anderer Command
  reader = command.ExecuteReader();
  ...
}
Müsste ich da reader.Dispose() aufrufen bevor ich die Variable wiederverwende?

nöö, macht doch using automatisch. Das ist ja der Sinn der using Anweisung.
 
Ich glaube, Du hast mich missverstanden.
nöö, macht doch using automatisch. Das ist ja der Sinn der using Anweisung.
Using ruft Dispose auf, wenn der Block irgendwie (per Exception oder regulär) verlassen wird. Ich verwende aber die Variable innerhalb des using-Blocks wieder, d. h. ich setze sie innerhalb des using-Blocks auf eine neue Referenz. Meine Frage ist nun, ob ich vor diesem Neusetzen explizit Dispose aufrufen muss. Der using-Block wird da ja nicht verlassen.
Ich tendiere dazu, dass ich Dispose explizit aufrufen oder eben 2 using-Blöcke nutzen muss, aber vll. irre ich mich ja.
 
Zurück
Oben Unten