Sqlite Datensatz löschen

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Sqlite Datensatz löschen

    Hi
    habe mir mal ein Sqlite example runtergeladen um mich mal mit Sqlite zu beschäftigen.
    Die Tabellen habe ich mit DB Browser for Sqlite erstellt.

    Das Problem was ich habe, ist das löschen eines Datensatzes komme da einfach nicht klar.

    Hier mal der Code

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Data.SQLite
    3. Imports System.ComponentModel
    4. Public Class admin
    5. Private connectionString = String.Empty
    6. Private password_changed As Boolean = False
    7. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. ' declare the SQLite database connection string
    9. connectionString = String.Format("Data Source={0};Version=3;",
    10. Directory.GetCurrentDirectory() & "\" & "myadress.db")
    11. ' Load Users List
    12. LoadUserFromDb()
    13. End Sub
    14. ' Populate the ListBox with user data from database table "users"
    15. Private Sub LoadUserFromDb()
    16. Dim userInfo As DataRow = Nothing
    17. Dim sql As String = "SELECT * FROM users;"
    18. Try
    19. Dim current_index As Int16 = lb_users.SelectedIndex
    20. Using conn As New SQLiteConnection(connectionString.ToString)
    21. Using cmd As New SQLiteCommand(conn)
    22. cmd.CommandText = sql
    23. conn.Open()
    24. Using da As New SQLiteDataAdapter(cmd)
    25. Dim dt As New DataTable
    26. da.Fill(dt)
    27. If dt.Rows.Count > 0 Then
    28. lb_users.DisplayMember = "user_fullname"
    29. lb_users.ValueMember = "user_id"
    30. lb_users.DataSource = dt
    31. End If
    32. End Using
    33. End Using
    34. End Using
    35. If current_index > 0 Then
    36. lb_users.SelectedIndex = current_index
    37. End If
    38. Catch ex As Exception
    39. MsgBox(ex.Message)
    40. End Try
    41. End Sub
    42. Private Sub LoadUserInfo(user_id As String)
    43. Dim userInfo As DataRow = Nothing
    44. Dim sql As String = "SELECT * FROM users WHERE user_id = @user_id;"
    45. Try
    46. Using conn As New SQLiteConnection(connectionString.ToString)
    47. Using cmd As New SQLiteCommand(conn)
    48. cmd.Parameters.AddWithValue("@user_id", user_id)
    49. cmd.CommandText = sql
    50. conn.Open()
    51. Using da As New SQLiteDataAdapter(cmd)
    52. Dim dt As New DataTable
    53. da.Fill(dt)
    54. If dt.Rows.Count > 0 Then
    55. userInfo = dt.Rows(0)
    56. txt_user_id.Text = userInfo("user_id")
    57. txt_user_name.Text = userInfo("user_name")
    58. txt_user_fullname.Text = userInfo("user_fullname")
    59. txt_user_password.Text = userInfo("user_password")
    60. 'CheckBox1.Text = userInfo("admin")
    61. txt_user_salt.Text = IIf(IsDBNull(userInfo("user_salt")), "", userInfo("user_salt"))
    62. password_changed = False
    63. End If
    64. End Using
    65. End Using
    66. End Using
    67. Catch ex As Exception
    68. MsgBox(ex.Message)
    69. End Try
    70. End Sub
    71. ' This function will create new user.
    72. Private Sub insert_new_user()
    73. Dim SQL As String = String.Empty
    74. Dim iReturnValue As Integer = 0
    75. Dim oCmd As New SQLiteCommand
    76. Dim passSalt As String = String.Empty
    77. Dim passHash As String = String.Empty
    78. passSalt = Utils.CreateSalt()
    79. passHash = Utils.GetSaltedHash(txt_user_password.Text.Trim, passSalt)
    80. ' Add new user
    81. SQL &= "INSERT INTO users (user_name, user_fullname, user_password, user_salt,admin) "
    82. SQL &= "VALUES (@user_name, @user_fullname, @user_password, @user_salt,@admin)"
    83. Try
    84. With oCmd
    85. .Parameters.AddWithValue("@user_name", txt_user_name.Text.Trim)
    86. .Parameters.AddWithValue("@user_fullname", txt_user_fullname.Text.Trim)
    87. .Parameters.AddWithValue("@user_password", passHash)
    88. .Parameters.AddWithValue("@user_salt", passSalt)
    89. .Parameters.AddWithValue("@admin", CheckBox1.Checked.ToString.Trim)
    90. End With
    91. Using conn As New SQLiteConnection(connectionString.ToString)
    92. Using oCmd
    93. oCmd.Connection = conn
    94. oCmd.CommandText = SQL
    95. conn.Open()
    96. iReturnValue = oCmd.ExecuteNonQuery()
    97. End Using
    98. End Using
    99. LoadUserFromDb()
    100. Catch ex As Exception
    101. If ex.Message.Contains("Einschränkung fehlgeschlagen") Then
    102. MsgBox("Der Anmeldename muss eindeutig sein")
    103. Else
    104. MsgBox(ex.Message)
    105. End If
    106. End Try
    107. End Sub
    108. ' This function will update the information and password of the current user
    109. Private Sub update_user_data()
    110. Dim SQL As String = String.Empty
    111. Dim iReturnValue As Integer = 0
    112. Dim oCmd As New SQLiteCommand
    113. Dim passSalt As String = String.Empty
    114. Dim passHash As String = String.Empty
    115. If password_changed = True Then
    116. passSalt = Utils.CreateSalt()
    117. passHash = Utils.GetSaltedHash(txt_user_password.Text.Trim, passSalt)
    118. ' Update the current user information
    119. ' the current password has been changed, create new salt and new hashed passord
    120. SQL &= "UPDATE users SET user_name = @user_name, user_fullname = @user_fullname,admin "
    121. SQL &= "user_password = @user_password, user_salt = @user_salt,@admin "
    122. SQL &= "WHERE user_id = @user_id"
    123. With oCmd
    124. .Parameters.AddWithValue("@user_id", txt_user_id.Text.Trim)
    125. .Parameters.AddWithValue("@user_name", txt_user_name.Text.Trim)
    126. .Parameters.AddWithValue("@user_fullname", txt_user_fullname.Text.Trim)
    127. .Parameters.AddWithValue("@user_password", passHash)
    128. .Parameters.AddWithValue("@user_salt", passSalt)
    129. .Parameters.AddWithValue("@admin", CheckBox1.Checked.ToString.Trim)
    130. End With
    131. Else
    132. ' Update the current user information
    133. ' the current passord didn't changed, no need to create salt and hashed password
    134. SQL &= "UPDATE users SET user_name = @user_name, user_fullname = @user_fullname,admin=@admin "
    135. SQL &= "WHERE user_id = @user_id"
    136. With oCmd
    137. .Parameters.AddWithValue("@user_id", txt_user_id.Text.Trim)
    138. .Parameters.AddWithValue("@user_name", txt_user_name.Text.Trim)
    139. .Parameters.AddWithValue("@user_fullname", txt_user_fullname.Text.Trim)
    140. .Parameters.AddWithValue("@admin", CheckBox1.Checked.ToString.Trim)
    141. End With
    142. End If
    143. Try
    144. Using conn As New SQLiteConnection(connectionString.ToString)
    145. Using oCmd
    146. oCmd.Connection = conn
    147. oCmd.CommandText = SQL
    148. conn.Open()
    149. iReturnValue = oCmd.ExecuteNonQuery()
    150. End Using
    151. End Using
    152. LoadUserFromDb()
    153. Catch ex As Exception
    154. MsgBox(ex.Message)
    155. End Try
    156. End Sub
    157. Private Sub btn_exit_Click(sender As Object, e As EventArgs) Handles btn_exit.Click
    158. Me.Close()
    159. End Sub
    160. Private Sub MainForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    161. Application.Exit()
    162. End Sub
    163. Private Sub lb_users_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lb_users.SelectedIndexChanged
    164. Try
    165. Dim user_id As String = lb_users.SelectedValue.ToString
    166. LoadUserInfo(user_id)
    167. Catch ex As Exception
    168. End Try
    169. End Sub
    170. Private Sub btn_add_user_Click(sender As Object, e As EventArgs) Handles btn_add_user.Click
    171. txt_user_name.Select()
    172. txt_user_id.Clear()
    173. txt_user_name.Clear()
    174. txt_user_fullname.Clear()
    175. txt_user_password.Clear()
    176. txt_user_salt.Clear()
    177. End Sub
    178. Private Sub btn_save_user_Click(sender As Object, e As EventArgs) Handles btn_save_user.Click
    179. If String.IsNullOrEmpty(txt_user_id.Text.Trim) Then
    180. ' Add new user
    181. insert_new_user()
    182. Else
    183. ' Update current user information
    184. update_user_data()
    185. End If
    186. End Sub
    187. Private Sub txt_user_password_TextChanged(sender As Object, e As EventArgs) Handles _
    188. txt_user_password.TextChanged
    189. password_changed = True
    190. End Sub
    191. Private Sub Btn_Delete_Click(sender As Object, e As EventArgs) Handles Btn_Delete.Click
    192. Dim connect As New SQLite.SQLiteConnection()
    193. Dim command As SQLiteCommand
    194. connectionString = String.Format("Data Source={0};Version=3;",
    195. Directory.GetCurrentDirectory() & "\" & "myadress.db")
    196. 'connect.Open()
    197. 'connect.Close()
    198. connect.Open()
    199. command = connect.CreateCommand
    200. command.CommandText = "DELETE FROM users WHERE user_id =@user_id" 'Die Query
    201. command.ExecuteNonQuery() ' Die Query wird ausgeführt
    202. command.Dispose()
    203. connect.Close() 'Schließen
    204. End Sub
    205. End Class


    Bekomme diese Meldung.
    Wahrscheinlich sitze ich schon zu lange an diesem Problem und habe die Übersicht verloren...
    Bilder
    • sqlite_delete.jpg

      85,34 kB, 1.212×479, 81 mal angesehen
    Ich hab zwar keine Ahnung von SQL, aber musst Du nicht noch irgendwo zuweisen, dass connectionstring zu connect oder command gehört? Weil: So ist es ja nur ein String, der irgendwo zusammenhanglos in der Luft hängt.

    Ach ja, weiter oben steht's ja, wie es wohl geht: Using conn As New SQLiteConnection(connectionString.ToString)

    btw:
    Stichwort MsgBox: Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    und
    Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed du warst schon auf dem Richtigen dampfer, in der Prozedur, in der die Exception fliegt, wird der neuen Connection nie der ConnectionString mitgegeben. Daher ist auch der "string value to be split" null.

    @manni4545 deklarier den ConnectionString bevor du die Connection erstellst:
    Aus:

    VB.NET-Quellcode

    1. Dim connect As New SQLite.SQLiteConnection()
    2. Dim command As SQLiteCommand
    3. connectionString = String.Format("Data Source={0};Version=3;",Directory.GetCurrentDirectory() & "\" & "myadress.db")

    mach:

    VB.NET-Quellcode

    1. connectionString = String.Format("Data Source={0};Version=3;",Directory.GetCurrentDirectory() & "\" & "myadress.db")
    2. Dim connect As New SQLite.SQLiteConnection(connectionString )
    3. Dim command As SQLiteCommand
    Damit ich das richtig verstehe: Du hast sicherlich versucht, meinen Post umzusetzen und hast das hier erhalten:

    VB.NET-Quellcode

    1. Private Sub Btn_Delete_Click(sender As Object, e As EventArgs) Handles Btn_Delete.Click
    2. connectionString = String.Format("Data Source={0};Version=3;",
    3. Directory.GetCurrentDirectory() & "\" & "myadress.db")
    4. Using connect As New SQLite.SQLiteConnection(connectionString)
    5. Dim command As SQLiteCommand
    6. 'connect.Open()
    7. 'connect.Close()
    8. connect.Open()
    9. command = connect.CreateCommand
    10. command.CommandText = "DELETE FROM users WHERE user_id =@user_id" 'Die Query
    11. command.ExecuteNonQuery() ' Die Query wird ausgeführt
    12. command.Dispose()
    13. End Using
    14. End Sub

    Funktioniert das gar nicht, also kommt die gleiche Fehlermeldung oder kommt was anderes als Fehler oder was? Da Du nicht auf meinen Post eingegangen bist, sondern nochmal zusammengefasst sagst "Hilfe!", weiß ich leider nicht genau, was Du jetzt noch probiert hast und was Du als Ergebnis erhältst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @BlueLagoonX Ich hab keine Ahnung wie du auf Oracle kommst, aber @manni4545 setzt SQLite ein.
    Wenn schon, dann poste doch bitte gleich das richtige:
    connectionstrings.com/sqlite-net-provider/

    Abgesehen davon, ist sein ConnectionString sowieso korrekt.
    btw. LMGTFY wird hier als Spam angesehen (nachzulesen in den Nutzungsbestimmungen)
    Ich habe es so gelöst und es funktioniert prima.

    Anlegen einer Datenbank

    C#-Quellcode

    1. // Datenbank und Verbindung anlegen, dann Verbindung öffnen
    2. string dataSource = "SQLiteDemo.db";
    3. SQLiteConnection connection = new SQLiteConnection
    4. {
    5. ConnectionString = "Data Source=" + dataSource
    6. };
    7. connection.Open();
    8. // neuen Befehl erstellen
    9. SQLiteCommand command = new SQLiteCommand(connection);
    10. // neue Tabelle anlegen sofern diese noch nicht existiert
    11. //command.CommandText = "CREATE TABLE IF NOT EXISTS beispiel (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL);";
    12. command.CommandText = "CREATE TABLE IF NOT EXISTS messwerte (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, tempaussen REAL, tempinnen REAL, feuchteaussen REAL, feuchteinnen REAL);";
    13. command.ExecuteNonQuery();
    14. command.Dispose();
    15. connection.Close();
    16. connection.Dispose();


    Eintragen in Datenbank

    C#-Quellcode

    1. string strtempaussen, strtempinnen, strfeuchteaussen, strfeuchteinnen;
    2. strtempaussen = tempaussen.ToString("G",CultureInfo.InvariantCulture);
    3. strtempinnen = tempinnen.ToString("G",CultureInfo.InvariantCulture);
    4. strfeuchteaussen = feuchteaussen.ToString("G",CultureInfo.InvariantCulture);
    5. strfeuchteinnen = feuchteinnen.ToString("G",CultureInfo.InvariantCulture);
    6. // Datenbank und Verbindung anlegen, dann Verbindung öffnen
    7. string dataSource = "SQLiteDemo.db";
    8. SQLiteConnection connection = new SQLiteConnection();
    9. connection.ConnectionString = "Data Source=" + dataSource;
    10. connection.Open();
    11. // neuen Befehl erstellen
    12. SQLiteCommand command = new SQLiteCommand(connection);
    13. //command.CommandText = string.Format("INSERT INTO messwerte (id, tempaussen, tempinnen, feuchteaussen, feuchteinnen) VALUES(NULL, '{0}','{1}','{2}','{3}')", strtempaussen, strtempinnen, strfeuchteaussen, strfeuchteinnen);
    14. command.CommandText = string.Format("INSERT INTO messwerte (id, tempaussen, tempinnen, feuchteaussen, feuchteinnen) VALUES(@id, @tempaussen, @tempinnen, @feuchteaussen, @feuchteinnen)");
    15. command.CommandType = CommandType.Text;
    16. command.Parameters.Add(new SQLiteParameter("@id",null));
    17. command.Parameters.Add(new SQLiteParameter("@tempaussen",strtempaussen));
    18. command.Parameters.Add(new SQLiteParameter("@tempinnen",strtempinnen));
    19. command.Parameters.Add(new SQLiteParameter("@feuchteaussen",strfeuchteaussen));
    20. command.Parameters.Add(new SQLiteParameter("@feuchteinnen",strfeuchteinnen));
    21. command.ExecuteNonQuery();
    22. command.Dispose();
    23. connection.Close();
    24. connection.Dispose();
    wobei ich malwieder anmerke, dass man sowas doch über typisiertes Dataset abwickeln sollte.
    Post#1, Listing#1 ist doch grotesk, da 250 Zeilen für son Pillepalle aufzuwenden.

    Zumindest aber den DataAdapter richtig konfigurieren (mithilfe SqlCommandBuilder) und verwenden.
    Ein DataAdapter kann nämlich beides: Daten abrufen, und geänderte Daten rückspeichern.

    gugge vlt. Dataset->Db
    (wobei das schon eine wesentlich weiter gehende Lösung ist)

    Immerhin das letzte Snippet des angegebenen Tuts zeigt, dass es - unter Einbindung des gegebenen Helper-Codes - mit ca. 30 Zeilen getan ist (und mehr sollte es auch nicht sein).

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()