Hallo miteinander
ich habe 2 Tabellen, die über eine zusätzliche Link-Tabelle miteinander verknüpft werden. Beim speichern eines Filmes in die
Das ganze läuft jetzt folgendermassen ab (
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
Hier mein Code:
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
actors
actorlinkmovie
Das ganze läuft jetzt folgendermassen ab (
idMovie
ist bekannt zu diesem Zeitpunkt):- Bereinigung der
actorlinkmovie
Tabelle, indem alle bisherigen Einträge mit bestimmteridMovie
gelöscht werden - falls beim Speichern bereits die
idActor
bekannt ist, dann einfach nur diestrThumb
aktualisieren und dieactorlinkmovie
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 Tabelleactors
vorhanden ist
wenn vorhanden,strThumb
aktualisieren und bestehendeidActor
zurückgeben
wenn nicht vorhanden, neuenstrActor
mitstrThumb
anlegen und neueidActor
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
- 'Actors
- Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
- SQLcommand_actorlinkmovie.CommandText = String.Concat("DELETE FROM actorlinkmovie WHERE idMovie = ", _movieDB.ID, ";")
- SQLcommand_actorlinkmovie.ExecuteNonQuery()
- End Using
- Dim iActor As Long = 0
- For Each actor As MediaContainers.Person In _movieDB.Movie.Actors
- If actor.ID > -1 Then
- Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
- SQLcommand_actor.CommandText = String.Concat("INSERT OR REPLACE INTO actors (idActor, strActor, strThumb) VALUES (?,?,?);")
- Dim par_actor_idActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_idActor", DbType.UInt64, 0, "idActor")
- Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
- Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
- par_actor_idActor.Value = actor.ID
- par_actor_strActor.Value = actor.Name
- par_actor_strThumb.Value = actor.Thumb
- SQLcommand_actor.ExecuteNonQuery()
- End Using
- Else
- Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
- SQLcommand_actor.CommandText = "SELECT idActor FROM actors WHERE strActor = (?);"
- Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
- par_actor_strActor.Value = actor.Name
- Using SQLreader As SQLite.SQLiteDataReader = SQLcommand_actor.ExecuteReader
- If SQLreader.HasRows Then
- SQLreader.Read()
- actor.ID = Convert.ToInt64(SQLreader("idActor"))
- End If
- End Using
- End Using
- Using SQLcommand_actor As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
- If actor.ID > -1 Then
- SQLcommand_actor.CommandText = String.Concat("INSERT OR REPLACE INTO actors (idActor, strActor, strThumb) VALUES (?,?,?);")
- Dim par_actor_idActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_idActor", DbType.UInt64, 0, "idActor")
- Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
- Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
- par_actor_idActor.Value = actor.ID
- par_actor_strActor.Value = actor.Name
- par_actor_strThumb.Value = actor.Thumb
- SQLcommand_actor.ExecuteNonQuery()
- Else
- SQLcommand_actor.CommandText = String.Concat("INSERT INTO actors (", _
- "strActor, strThumb) VALUES (?,?); SELECT LAST_INSERT_ROWID() FROM actors;")
- Dim par_actor_strActor As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strActor", DbType.String, 0, "strActor")
- Dim par_actor_strThumb As SQLite.SQLiteParameter = SQLcommand_actor.Parameters.Add("par_actor_strThumb", DbType.String, 0, "strThumb")
- par_actor_strActor.Value = actor.Name
- par_actor_strThumb.Value = actor.Thumb
- actor.ID = Convert.ToInt64(SQLcommand_actor.ExecuteScalar)
- End If
- End Using
- End If
- Using SQLcommand_actorlinkmovie As SQLite.SQLiteCommand = _myvideosDBConn.CreateCommand()
- SQLcommand_actorlinkmovie.CommandText = String.Concat("INSERT OR REPLACE INTO actorlinkmovie (idActor, idMovie, strRole, iOrder) VALUES (?,?,?,?);")
- Dim par_actorlinkmovie_idActor As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_idActor", DbType.UInt64, 0, "idActor")
- Dim par_actorlinkmovie_idMovie As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_idMovie", DbType.UInt64, 0, "idMovie")
- Dim par_actorlinkmovie_strRole As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_strRole", DbType.String, 0, "strRole")
- Dim par_actorlinkmovie_iOrder As SQLite.SQLiteParameter = SQLcommand_actorlinkmovie.Parameters.Add("par_actorlinkepisode_iOrder", DbType.UInt64, 0, "iOrder")
- par_actorlinkmovie_idActor.Value = actor.ID
- par_actorlinkmovie_idMovie.Value = _movieDB.ID
- par_actorlinkmovie_strRole.Value = actor.Role
- par_actorlinkmovie_iOrder.Value = iActor
- SQLcommand_actorlinkmovie.ExecuteNonQuery()
- iActor += 1
- End Using
- Next