SQLite - Arbeiten mit Link-Tabellen

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

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von xaos.

    SQLite - Arbeiten mit Link-Tabellen

    Hallo miteinander

    ich habe 2 Tabellen, die über eine zusätzliche Link-Tabelle miteinander verknüpft werden. Beim speichern eines Filmes in die movie Tabelle sollen die Schauspieler mit richtigem Namen in der actors Tabelle gespeichert und über die actorlinkmovie Tabelle mit dem Film verknüpft werden. In der actorlinkmovie Tabelle wird der Name der Rolle gespeichert, in der actors Tabelle zusätzlich noch eine URL zu einem Bild des Schauspielers.

    movie

    VB.NET-Quellcode

    1. CREATE TABLE movie (
    2. idMovie integer,
    3. Title text
    4. );


    actors

    VB.NET-Quellcode

    1. CREATE TABLE actors (
    2. idActor integer,
    3. strActor text NOT NULL,
    4. strThumb text
    5. );


    actorlinkmovie

    VB.NET-Quellcode

    1. CREATE TABLE actorlinkmovie (
    2. idActor integer,
    3. idMovie integer,
    4. strRole text,
    5. iOrder integer
    6. );



    Das ganze läuft jetzt folgendermassen ab (idMovie ist bekannt zu diesem Zeitpunkt):
    • Bereinigung der actorlinkmovie Tabelle, indem alle bisherigen Einträge mit bestimmter idMovie gelöscht werden
    • falls beim Speichern bereits die idActor bekannt ist, dann einfach nur die strThumb aktualisieren und die actorlinkmovie Tabelle füllen
      (dies trifft zu, wenn der Film bereits gespeichert und aus vorher der Datenbank geladen wurde)
    • prüfen, ob bereits ein Schauspieler mit selbem Namen (strActor) in Tabelle actors vorhanden ist
      wenn vorhanden, strThumb aktualisieren und bestehende idActor zurückgeben
      wenn nicht vorhanden, neuen strActor mit strThumb anlegen und neue idActor zurückgeben
    • danach die actorlinkmovie Tabelle füllen


    Ich habe bereits einen funktionierenden Code, aber ich bin mir sicher, dass dieser viel zu umständlich aufgebaut ist. Es müsste doch möglich sein, mit INSERT OR REPLACE den strActor zu überprüfen und wenn nötig neu anzulegen, dabei dann gleich auch die idActor zurückzugeben.

    Hier mein Code:

    VB.NET-Quellcode

    1. 'Actors
    2. Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    3. SQLcommand_actorlinkmovie.CommandText = String.Concat("DELETE FROM actorlinkmovie WHERE idMovie = ", _movieDB.ID, ";")
    4. SQLcommand_actorlinkmovie.ExecuteNonQuery()
    5. End Using
    6. Dim iActor As Long = 0
    7. For Each actor As MediaContainers.Person In _movieDB.Movie.Actors
    8. If actor.ID > -1 Then
    9. Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    10. SQLcommand_actor.CommandText = String.Concat("INSERT OR REPLACE INTO actors (idActor, strActor, strThumb) VALUES (?,?,?);")
    11. Dim par_actor_idActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_idActor", DbType.UInt64, 0, "idActor")
    12. Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
    13. Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
    14. par_actor_idActor.Value = actor.ID
    15. par_actor_strActor.Value = actor.Name
    16. par_actor_strThumb.Value = actor.Thumb
    17. SQLcommand_actor.ExecuteNonQuery()
    18. End Using
    19. Else
    20. Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    21. SQLcommand_actor.CommandText = "SELECT idActor FROM actors WHERE strActor = (?);"
    22. Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
    23. par_actor_strActor.Value = actor.Name
    24. Using SQLreader As SQLite.SQLiteDataReader = SQLcommand_actor.ExecuteReader
    25. If SQLreader.HasRows Then
    26. SQLreader.Read()
    27. actor.ID = Convert.ToInt64(SQLreader("idActor"))
    28. End If
    29. End Using
    30. End Using
    31. Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    32. If actor.ID > -1 Then
    33. SQLcommand_actor.CommandText = String.Concat("INSERT OR REPLACE INTO actors (idActor, strActor, strThumb) VALUES (?,?,?);")
    34. Dim par_actor_idActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_idActor", DbType.UInt64, 0, "idActor")
    35. Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
    36. Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
    37. par_actor_idActor.Value = actor.ID
    38. par_actor_strActor.Value = actor.Name
    39. par_actor_strThumb.Value = actor.Thumb
    40. SQLcommand_actor.ExecuteNonQuery()
    41. Else
    42. SQLcommand_actor.CommandText = String.Concat("INSERT INTO actors (", _
    43. "strActor, strThumb) VALUES (?,?); SELECT LAST_INSERT_ROWID() FROM actors;")
    44. Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
    45. Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
    46. par_actor_strActor.Value = actor.Name
    47. par_actor_strThumb.Value = actor.Thumb
    48. actor.ID = Convert.ToInt64(SQLcommand_actor.ExecuteScalar)
    49. End If
    50. End Using
    51. End If
    52. Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    53. SQLcommand_actorlinkmovie.CommandText = String.Concat("INSERT OR REPLACE INTO actorlinkmovie (idActor, idMovie, strRole, iOrder) VALUES (?,?,?,?);")
    54. Dim par_actorlinkmovie_idActor As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_idActor", DbType.UInt64, 0, "idActor")
    55. Dim par_actorlinkmovie_idMovie As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_idMovie", DbType.UInt64, 0, "idMovie")
    56. Dim par_actorlinkmovie_strRole As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_strRole", DbType.String, 0, "strRole")
    57. Dim par_actorlinkmovie_iOrder As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_iOrder", DbType.UInt64, 0, "iOrder")
    58. par_actorlinkmovie_idActor.Value = actor.ID
    59. par_actorlinkmovie_idMovie.Value = _movieDB.ID
    60. par_actorlinkmovie_strRole.Value = actor.Role
    61. par_actorlinkmovie_iOrder.Value = iActor
    62. SQLcommand_actorlinkmovie.ExecuteNonQuery()
    63. iActor += 1
    64. End Using
    65. Next

    Ohne das jetzt getestet zu haben:

    VB.NET-Quellcode

    1. 'Actors
    2. Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    3. SQLcommand_actorlinkmovie.CommandText = String.Concat("DELETE FROM actorlinkmovie WHERE idMovie = ", _movieDB.ID, ";")
    4. SQLcommand_actorlinkmovie.ExecuteNonQuery()
    5. End Using
    6. Dim iActor As Long = 0
    7. For Each actor As MediaContainers.Person In _movieDB.Movie.Actors
    8. Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    9. SQLcommand_actor.CommandText = String.Concat("UPDATE actors SET strThumb = :strThumb WHERE strActor = :strActor; INSERT OR IGNORE INTO actors (strActor, strThumb) VALUES (:strActor, :strThumb); SELECT idActor FROM actors WHERE strActor = :strActor;")
    10. SQLcommand_actor.Parameters.Add("strActor", DbType.String).Value = actor.Name
    11. SQLcommand_actor.Parameters.Add("strThumb", DbType.String).Value = actor.Thumb
    12. actor.ID = Convert.ToInt64(SQLcommand_actor.ExecuteScalar)
    13. End Using
    14. Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
    15. SQLcommand_actorlinkmovie.CommandText = String.Concat("INSERT OR REPLACE INTO actorlinkmovie (idActor, idMovie, strRole, iOrder) VALUES (:idActor, :idMovie, :strRole, :iOrder);")
    16. SQLcommand_actorlinkmovie.Parameters.Add("idActor", DbType.UInt64).Value = actor.ID
    17. SQLcommand_actorlinkmovie.Parameters.Add("idMovie", DbType.UInt64).Value = _movieDB.ID
    18. SQLcommand_actorlinkmovie.Parameters.Add("strRole", DbType.String).Value = actor.Role
    19. SQLcommand_actorlinkmovie.Parameters.Add("iOrder", DbType.UInt64).Value = iActor
    20. SQLcommand_actorlinkmovie.ExecuteNonQuery()
    21. iActor += 1
    22. End Using
    23. Next


    Gruss vom neuen Nachbarn ;)