SQLite - Daten in Tabelle schreiben wenn nicht vorhanden, ansonsten neu anlegen und ID als Rückgabewert

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von DanCooper.

    SQLite - Daten in Tabelle schreiben wenn nicht vorhanden, ansonsten neu anlegen und ID als Rückgabewert

    Hallo

    ich habe 3 Tabellen: Movies, Sets und MoviesSets.
    Die Movie-Inforamtionen lese ich aus einer XML aus. Wenn dort <set>Avatar Collection</set> vorhanden ist soll während dem Speichern der Movie-Infos überprüft werden, ob schon ein Set mit selbem Namen in Sets vorhanden ist. Falls vorhanden benötige ich die SetID um in der Tabelle MoviesSets die MovieID mit der SetID abzulegen. Falls nicht vorhanden soll der Eintrag in Sets erstellt werden und die neue SetID zurückgegeben werden, damit ich ebenfalls in der MoviesSets Tabelle die beiden miteinander verknüpfen kann.

    Die Tabellen sehen folgendermassen aus:

    Quellcode

    1. CREATE TABLE Sets(
    2. ID INTEGER AUTOINCREMENT,
    3. SetName TEXT NOT NULL,
    4. HasPoster BOOL NOT NULL DEFAULT False,
    5. PosterPath TEXT,
    6. PRIMARY KEY (ID,SetName)
    7. );
    8. CREATE TABLE Movies (
    9. ID INTEGER PRIMARY KEY AUTOINCREMENT,
    10. Title TEXT
    11. );
    12. CREATE TABLE MoviesSets(
    13. MovieID INTEGER NOT NULL,
    14. SetID INTEGER NOT NULL,
    15. PRIMARY KEY (MovieID,SetID)
    16. );


    MovieDB Klasse:

    VB.NET-Quellcode

    1. Public Structure DBMovie
    2. Dim ID As Long
    3. Dim Title As String
    4. Dim Sets As List(Of DBMovieSet)
    5. End Structure
    6. Public Structure DBMovieSet
    7. Dim ID As Long
    8. Dim SetName As String
    9. End Structure



    VB um das Movie zu speichern:

    VB.NET-Quellcode

    1. Dim SQLtransaction As SQLite.SQLiteTransaction = Nothing
    2. If Not BatchMode Then SQLtransaction = _myvideosDBConn.BeginTransaction()
    3. Using SQLcommand As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    4. If IsNew Then
    5. SQLcommand.CommandText = String.Concat("INSERT OR REPLACE INTO movies (Title) VALUES (?); SELECT LAST_INSERT_ROWID() FROM movies;")
    6. Else
    7. SQLcommand.CommandText = String.Concat("INSERT OR REPLACE INTO movies (ID, Title) VALUES (?,?); SELECT LAST_INSERT_ROWID() FROM movies;")
    8. Dim parMovieID As SQLite.SQLiteParameter = SQLcommand.Parameters.Add("parMovieID", DbType.Int32, 0, "ID")
    9. parMovieID.Value = _movieDB.ID
    10. End If
    11. Dim parTitle As SQLite.SQLiteParameter = SQLcommand.Parameters.Add("parTitle", DbType.String, 0, "Title")
    12. parTitle.Value = _movieDB.Title
    13. If IsNew Then
    14. Using rdrMovie As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
    15. If rdrMovie.Read Then
    16. _movieDB.ID = Convert.ToInt64(rdrMovie(0))
    17. Else
    18. Master.eLog.Error(GetType(Database), "Something very wrong here: SaveMovieToDB", _movieDB.ToString, "Error")
    19. _movieDB.ID = -1
    20. Return _movieDB
    21. End If
    22. End Using
    23. Else
    24. SQLcommand.ExecuteNonQuery()
    25. End If
    26. End Using
    27. SQLtransaction.Commit()


    Danach soll jetzt die Abfrage in Sets und Eintrag in MoviesSets folgen.

    Ich hoffe ich habe das jetzt richtig zusammengekürtzt, es gibt in allen Tabellen in Klassen noch weitere Felder.