Laden...

Syntax Fehler im SQL

Letzter Beitrag vor 19 Jahren 12 Posts 5.040 Views
Syntax Fehler im SQL

Hi,

ich lese eine csv Datei aus, die ich zur LAufzeit aus einer DBF Datei generiere. Nun hab ich aber das Problem, dass ich die Zeilen die ich aus der csv Datei nach MS Access bringen muß. Eigentlich kein Problem aber ich bekomm immer einen Syntax Fehler beim inser statement :


Insert into Designs (DesignNull,Schablonenzahl,Design,VARIATION,ARTIKEL,FBEH,W1,V1,Z1,COUP1,FOND,STANDARD,KUNDE,KOLORIST,DATNEU,DATUPD,TEXT,WREIHE,HOST,ALT_VAR)Values (01044 ,0,1044 ,"I","BlahBlubb","J","KG 2/9O 1/4R 1/250   - 1117.4",8.0," ","CLA"," "," "," "," "," "," "," ","1"," "," ")

Hab auch schon probiert die " durch ' zuersetzen dann bekomm ich allerdings den Fehler "Error: Unzulässige SQL-Anweisung; 'DELETE', 'INSERT', 'SELECT' oder 'UPDATE' erwartet. (State:37000, Native Code: FFFFF254)" ...

Ah by the way kennt MS Access sowas wie "on duplicate key update" ?

Gruß Chris

ich kenne mich mit MsAccess zwar nicht aus, aber bin mir ziemlich sicher das auch dort Zeichenketten mit ' und nicht mit " abgegrenzt werden.

die fehlermeldung kann auch andere ursache haben. hast du schon geprüft, ob fehler bei jedem datensatz kommt, oder nur immer bei dem selben?

State 37000 bedeutet "Syntaxfehler oder Zugriffsverletzung"

zeig mal etwas code, dann kann man vielleicht etwas mehr sagen.

Um diese Art von Probleme zu unterbinden solltest Du mit den Commandparametern arbeiten.

Den Insert String ändern in


Insert into Designs (DesignNull,Schablonenzahl,Design,VARIATION,ARTIKEL,FBEH,W1,V1,Z1,COUP1,FOND,STANDARD,KUNDE,KOLORIST,DATNEU,DATUPD,TEXT,WREIHE,HOST,ALT_VAR)Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);

Und dann die Daten So Anhängen


InsertCmd.Parameters.Add("@DesignNull").Value = 01044;
.
.
.

Aber da Access den namen der Parameter nicht ausliesst, auf die Korrekte Reihenfolge achten.

Hi,

es funktioniert jetzt. Hab die Insert Anweisung Stück für Stück getestet. Sobald ich das Feld TEXT mit reingenommen hab, gabs die Fehlermeldung. Hab nun das Tabellenfeld TEXT in TEXT1 umbenannt dannn gings. K.A. warum Access ein Problem mit diesem Feld hatte ..

Trotzdem Danke

Chris

weil er das als Typ und nicht als Feldname erkennt?

Du kannst alternativ versuchen Feldnamen in [] zu setzen.

Da zervantis' Problem geklärt zu sein scheint, frag ich jetzt mal nach meinem Problem:

Ich habe ebenfalls eine INSERT-Anweisung, die mit einem Syntaxfehler belegt zu sein scheint. Leider finde ich diesen nicht...

Also, hier der Aufbau der Anweisung:

sql = "INSERT INTO Movies (Category, Title, SubTitle, Actors, Director, Production, Year, Added, Format, Length, Size, SizeFormat, Description, Pictures, Links, Comment, Rating) VALUES ";
				sql += "(" + this.movCategory + ", ";
				sql += "'" + this.movTitle + "', ";
				sql += "'" + this.movSubTitle + "', ";
				sql += "'" + actorsToString + "', ";
				sql += this.movDirector + ", ";
				sql += this.movProduction + ", ";
				sql += this.movYear + ", ";
				sql += "'" + DateTime.Now + "', ";
				sql += this.movFormat + ", ";
				sql += "'" + this.movLength + "', ";
				sql += this.movSize + ", ";
				sql += "'" + this.movSizeFormat + "', ";
				sql += "'" + this.movDescription + "', ";
				sql += "'" + picturesToString + "', ";
				sql += "'" + linksToString + "', ";
				sql += "'" + this.movComment + "', ";
				sql += this.movRating + ")";

Daraus wird zum Beispiel folgendes:


INSERT INTO Movies (Category, Title, SubTitle, Actors, Director, Production, Year, Added, Format, Length, Size, SizeFormat, Description, Pictures, Links, Comment, Rating) VALUES (4, 'Filmtitel', 'Untertitel', '256;257;258', 1, 1, 2004, '16.01.2005 20:10:32', 2, '02:02:03', 666, 'MB', 'Beschreibung', 'D:\\01_0.JPEG;D:\\01_01_1.JPEG;D:\\01_08_0.JPEG;D:\\01_08_1.JPEG', '49', 'Kommentar', 5)

Hier noch die Tabelle:

Index (AutoWert)
Category (Integer)
Title (Text)
SubTitle (Text)
Actors (Memo)
Director (Integer)
Production (Integer)
Year (Integer)
Added (Text)
Format (Integer)
Length (Text)
Size (Double)
SizeFormat (Text)
Description (Text)
Pictures (Memo)
Links (Memo)
Comment (Memo)
Rating (Integer)

Was mach ich denn bitte falsch?

Greets - SK

Sagte ich schon Danke? Nein? ...kommt noch...

Kommt eine Fehlermeldung?
Schau Dir mal die Sql- bzw. OleDbParameter Klassen an und baue mit denen Deine Query um.

Die einzige Fehlermeldung, die ich über e.Message (Exception e) bekommen habe, war "Syntaxfehler in der INSERT INTO-Anweisung".
Daher bin ich ein bisschen verwirrt...

Habe schon mal überlegt, ob ich nicht einfach die Zahlenwerte in Texte umwandle...muss ich dann halt rückwärts wieder in Zahlen umwandeln...aber naja...

So von der Art und Weise sollte es doch eigentlich stimmen, oder?

Greets - SK

Sagte ich schon Danke? Nein? ...kommt noch...

wie Noodles schon sagte, arbeite mit Parametern. Damit kannst du alle Fehler, die durch String-Werte oder beim Konvertieren von Fließkommazahlen in String (. und ,) und etc. entstehen können, vermeiden.

Das witzigste an der Sache:

Hab den SQL-String grad mal Parameter für Parameter aufgebaut.
Bis vor 'Year' ging das gut. Bei 'Year' meckerte er wieder rum. Also hab ich mal alles in Strings umgewandelt. Meckerte immernoch.
Also kam ich auf die Idee, dass "Year" vielleicht eine Art reserviertes Wort sein könnte und habe die Spalte in PYear umbenannt!
Alles geht reibungslos... 😁

Tja, so kann's gehen!

Die neue INSERT-INTO-Anweisung lautet jetzt:


sql = "INSERT INTO Movies (Category, Title, SubTitle, Actors, Director, Production, PYear, Added, Format, Length, PSize, SizeFormat, Description, Pictures, Links, Comment, Rating) VALUES ";
				sql += "('" + this.movCategory + "', ";
				sql += "'" + this.movTitle + "', ";
				sql += "'" + this.movSubTitle + "', ";
				sql += "'" + actorsToString + "', ";
				sql += "'" + this.movDirector + "', ";
				sql += "'" + this.movProduction + "', ";
				sql += "'" + this.movYear + "', ";
				sql += "'" + DateTime.Now.ToString() + "', ";
				sql += "'" + this.movFormat + "', ";
				sql += "'" + this.movLength + "', ";
				sql += "'" + this.movSize + "', ";
				sql += "'" + this.movSizeFormat + "', ";
				sql += "'" + this.movDescription + "', ";
				sql += "'" + picturesToString + "', ";
				sql += "'" + linksToString + "', ";
				sql += "'" + this.movComment + "', ";
				sql += "'" + this.movRating + "')";

(Size war mein erster Verdacht...hab PSize draus gemacht).

Danke trotzdem!

Greets - SK

P.S: @Noodlles/Xqgene: Ich versteh kein Wort 🙁

Sagte ich schon Danke? Nein? ...kommt noch...

Hallo,

Noodles und Xqgene meinten, dass du die Parameters-Collection der Command-Klasse nutzen solltest. Das hat nicht nur Vorteile zum lesen und verändern vom Code, sondern macht das ganze auch kürzer und schützt dich vor SQL-Injection.

Das sähe zb so aus:


command.Parameters.Add("@Category",OleDbType.Integer).Value = this.movCategory;
command.Parameters.Add("@Title",OleDbType.VarChar).Value = this.movTitle;
command.Parameters.Add("@Subtitle",OleDbType.VarChar).Value = this.movSubTitle;
//usw..

command.CommandText = "INSERT INTO Movies (Category, Title, SubTitle) " +
"VALUES (@Category, @Title, @Subtitle)";

Hmm, sieht für mich allerdings doch ziemlich kompliziert aus...na ja, bin ja noch am Anfang...man lernt nie aus, nicht wahr!?

Greets - SK

Sagte ich schon Danke? Nein? ...kommt noch...