| 

.NET C# Java Javascript Exception

2
Guten Abend.

Ich bin nun seit ca. einer Stunde an der Abfrage dran und ich finde einfach nicht den Fehler...

"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"


Als Fehler kommt immer:
Anzahl der Abfragewerte und Zielfelder stimmt nicht überein.

Kann mir evtl. helfen ?
10.10.2012
Fridolin 31 1 4
9 Antworten
1
Ich blicke hier in der Reihenfolge der Antworte nicht mehr wirklich durch ... :(

Wenn Du den Fehler "... hat das falsche Format." immer noch hast, dann würde ich:

1. Den SQL String mal mit echten Werten füllen und direkt ausführen, ob es dann funktioniert und Du den vielleicht falsch "zusammenbaust".
2. Erst mal nur mit einem einzigen Parameter starten und schauen was dann passiert.
12.10.2012
Xantiva 2,3k 2 9
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
1
Nachdem ich auch schon zu oft mit Access-Eigenheiten kämpfen musste, versuch's mal so:

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,"'","''") & "');"


Edit: Syntax korrigiert.
11.10.2012
muffi 1,4k 1 9
muffi 1,4k 1 9
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
1
Nur so eine Vermutung. Bei deinem Vorgehen wirst du ein Problem bekommen wenn in der Quelltabelle Werte mit Hochkomma (') enthalten sind. Und bei einer Filmdatenbank erscheint mir das naheliegend. Dann helfen auch umschließende ('..' ) nicht.

Nebenbei 'INSERT INTO Filmtable .... FROM Filmtable', was macht das für einen Sinn?
11.10.2012
me 1,1k 2 9
Meine Antwort nur einfach anders ausformuliert :-)
muffi 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
1
Am besten arbeitest du mit Parameterbindung. Dann kann dir eine Name wie "Die 1'ten 10 Tage" keinen Fehler ins Statment einschleusen (Siehe auch SQL-Injection).

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()
11.10.2012
Floyd 14,6k 3 9
Floyd 14,6k 3 9
0
Was willst du denn mit den '" +- und + "'-Konstrukten erreichen? Entweder '"' oder "'", aber immer noch, wozu? Feldnamen gibst du nackt an oder in [], das gleiche gilt für die Aliase, falls die Punkt-Notation Access stört.
10.10.2012
mupan 575 1 8
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
0
Dein Statment ist falsch. Ich kenn zwar nicht die Struktur deiner Datenbank und syntaktisch ist es auch richtig aber es macht nicht das was du willst.

Richtiger:

"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"


Da du nur eine Tabelle benutzt kannst du die Tabellenprefixe auch weg lassen:

"INSERT INTO FilmTable (Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink) 
SELECT Name, Genre, Länge, Schauspieler1, Schauspieler2, IMDB, IMDBLink
FROM FilmTable"


Ansonsten noch ein Hinweis. SQL unterstützt Aliase auch bei Tabellennamen was die Lesbarkeit erhöht wenn man mit mehren Tabellen arbeitet:

"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"
10.10.2012
Floyd 14,6k 3 9
0
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;
}


Habe hier mal den Kompletten Absatz Kopiert damit ihr evtl. seht für was ich die Abfrage überhaupt brauche :)

Evtl. hilft euch das ja besser mir zu helfen ^^
10.10.2012
Fridolin 31 1 4
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
0
Wozu brauchst Du das Select? So wie Deine Methode benannt ist, würde ich erwarten, dass sie einfach dass hier macht (bis auf endlich viele Syntax-Fehler - sitze grad am Küchen-Netbook - soll nur die Idee illustrieren):

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} ));
10.10.2012
Matthias Hlawatsch 13,2k 4 9
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
0
Hallo,

Vielen Dank, habe das mal probiert und korrigiert, aber es will trotzdem nicht. Immernoch der gleiche Fehler :/

Also so wie ich meine Abfrage gemacht habe bwz. bei einer anderen Methode funkt. es richtig...nur hier irgendwie nicht...die andere Methode besteht auch nur aus 2 Spalten.
10.10.2012
Fridolin 31 1 4
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

Stelle deine Sql-Frage jetzt!