"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)
SELECT '" + Name + "' AS FilmTable.Name, '" + Genre + "' AS FilmTable.Genre,'" + Time + "' AS FilmTable.Länge,'" + Artist1 + "' AS FilmTable.Schauspieler1,'" + Artist2 + "' AS FilmTable.Schauspieler2,'" + RatingDBL + "' AS FilmTable.IMDB,'" + Link + "' AS FilmTable.IMDBLink
FROM FilmTable"
|
|
Funktioniert aber auch nur wenn die anderen Felder nullable sind. Parameterbindung ist die beste Lösung.
– Floyd 12.10.2012
|
||
Ja, richtig. Aber wichtig ist erst mal, ob der SQL String direkt funktioniert. Ich hatte mal das Problem, nach einem IN noch ein Leerzeichen vor der öffnenden Klammer zu haben: IN_( Das hat dann bei der mySQL Version nicht funktioniert ... ;)
– Xantiva 12.10.2012
|
||
Bitte lass mal die Tabellendefinition sehen, das wäre auch mal hilfreich.
Im Insert werden immer String-Werte reingesteckt, falls aber die Zieltabelle ein DATETIME- oder DOUBLE-Feld besitzt gibt es Probleme! Dann sollten die Werte für diese Felder korrekt formatiert sein ("8.5" anstatt "8,5", "#2012-10-12 11:46:00#" anstatt "12.10.2012 11:46:00"). Durch Verwendung von Parametern hat man dann gleich 2 Vorteile: - Formatierung wird durch .NET erledigt - Erhöhte Sicherheit (SQL Injection) – erh 12.10.2012
|
INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)
VALUES ('" & replace(Name,"'",''") & "','" & replace(Genre,"'","''") & "','" & replace(Time,"'","''") & "','" & replace (Artist1,"'","''") & "','" & replace(Artist2,"'","''") & "','" & replace(RatingDBL,"'","''") & "','" & replace(Link,"'","''") & "');"
|
Das verstehe ich nun garnicht :o
Dort sind zwar meine Strings / Double angegeben, aber woher wissen sie wohin sie geschrieben werden soll? Kann es gearde auch noch nicht testen, werde heute Nachmittag eine Rückmeldung geben, aber evtl. kannst du mir dazu ja noch was sagen! :) – Fridolin 11.10.2012
|
||
Indem Du in der Klammer hinter dem INSERT INTO FilmTable die zu füllenden Felder definierst, brauchst Du die Felder nicht weiter zu benennen. Mir fällt allerdings gerade auf, dass ich einen deftigen Fehler drin habe. Ich editiere gleich meine Antwort nochmal...
– muffi 11.10.2012
|
||
Ok vielen Dank :)
Ich versuche das heute mittag mal und werde dir dann eine Rückmeldung geben :) Bis dann – Fridolin 11.10.2012
|
|
Insert Into FilmTabelle(...)
select 123, 'testfil' ist durchaus gültigier SQL-Syntax. – Floyd 11.10.2012
|
||
Zweifellos, Floyd. Allerdings ist die Abfrage leichter lesbar, wenn ich in dem diskutierten Fall values() benutze. Ich verwende das select bei insert into nur, wenn hinterher auch ein from kommt. Zudem habe ich immer den Eindruck, dass die Version mit values() auf MySQL schneller läuft als mit select.
– muffi 11.10.2012
|
||
Nochmal, das wesentliche ist folgendes
Insert Into Filmtable (...) select 'Hab's gesehen', ... durch die Verwendung von SELECT '" + Name + "' AS FilmTable.Name, '" + Genre... mit Name == "Hab's gesehen" kann die generierte Abfrage unvorhergesehen ändern. SQL Injection wäre hier super möglich. @muffi ich sehe jetzt was du meinst, aber floyd's Ansatz halte ich für richtig, dort tritt das von mir dargestellte Problem nicht auf, Alternative - Parameter verwenden – me 11.10.2012
|
||
Es sollte nur von der Syntax her einen Unterschied zwischen values() und select geben. Das Problem mit ' tritt bei beiden Versionen auf.
– muffi 11.10.2012
|
Dim Conn1 As ADODB.Connection
Dim Cmd1 As ADODB.Command
Set Conn1 = New ADODB.Connection
Conn1.ConnectionString = "..."
Conn1.Open
Set Cmd1 = New ADODB.Command
Cmd1.ActiveConnection = Conn1
Cmd1.CommandText = _
"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)" & _
"VALUES(?,?,?,?,?,?,?)"
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Name)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Genre)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Time)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Artist1)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Artist2)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, RatingDBL)
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarChar, adParamInput, 100, Link)
Cmd1.Execute()
|
|
Weil z.b '" + Name + '", ist meinem Fall sogar richtig.
Da ich in C# die abfrage habe und Name ein String ist. – Fridolin 10.10.2012
|
"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)
SELECT FilmTable.Name, FilmTable.Genre, FilmTable.Länge, FilmTable.Schauspieler1, FilmTable.Schauspieler2, FilmTable.IMDB, FilmTable.IMDBLink
FROM FilmTable"
"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)
SELECT Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink
FROM FilmTable"
"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink)
SELECT ft.Name, ft.Genre, ft.Länge, ft.Schauspieler1, ft.Schauspieler2, ft.IMDB, ft.IMDBLink
FROM FilmTable as ft"
|
public void MovieAdd(String Name,String Genre,String Time,String Artist1,String Artist2,double RatingDBL,String Link)
{
// Baut die Verbindung zur Access Datenbank auf Updatet die Tabelle, benutzt die Strings aus den Textboxen
ConnectToAccess();
OleDbCommand command = new OleDbCommand("INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink) SELECT '" + Name + "' AS FilmTable.Name, '" + Genre + "' AS FilmTable.Genre,'" + Time + "' AS FilmTable.Länge,'" + Artist1 + "' AS FilmTable.Schauspieler1,'" + Artist2 + "' AS FilmTable.Schauspieler2,'" + RatingDBL + "' AS FilmTable.IMDB,'" + Link + "' AS FilmTable.IMDBLink FROM FilmTable", conn);
conn.Open();
command.ExecuteNonQuery();
conn.Close();
ausgabe.DataContext = con.T_Ausgabe().DefaultView;
}
|
Zeig mal die Tabellendefinition der Zieltabelle.
Ich seh hier 2 potentielle Probleme: 1.) Das Feld Länge ist ein DATETIME und wird als String mit falscher Formatierung eingefügt. 2.) Das Feld "IMDB" ist ein DOUBLE und wird mit einem Komma "8,2" anstatt einem Punkt "8.2" eingefügt. – erh 11.10.2012
|
OleDbCommand command = new OleDbCommand(string.Format("INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink) VALUES ({0}, {1}, {2}, {3}, {4}, 5}, {6})", new object[]{Name,Genre,Time,Artist1,Artist2,RatingDBL,Link} ));
|
Habe es ausprobiert, funktioniert auch nicht :/
Der Fehler ist Die Eingabezeichenfolge hat das falsche Format. Habe es in verschieden varianten beim eingeben probiert, funktioniert aber nicht. – Fridolin 11.10.2012
|
||
Das kann gut sein - ich wollte auch nur die Idee illustrieren, mit INSERT..VALUES zu arbeiten (wie andere es ja inzwischen auch vorgeschlagen haben) und nebenbei die String-Verkettung etwas übersichtlicher zu notieren. INSERT..SELECT würde ich nur verwenden, wenn die einzufügenden Werte tatsächlich aus einer DB-Tabelle gelesen werden und nicht "von außen" kommen.
Unabhängig davon bleibt aber das Risiko der SQL-Injection. Ich möchte Dir deshalb die Lösung von Floyd mit Parameterbindung ans Herz legen - die ist m.E. die beste. – Matthias Hlawatsch 12.10.2012
|
|
Schreibe solches Feedback bitte als Kommentar oder als Edit Deiner Frage. Durch Bewertungen werden die Antworten umsortiert, und es ist dann nicht mehr erkennbar, worauf Du Dich beziehst.
– Matthias Hlawatsch 12.10.2012
|