Probleme mit "INSERT INTO" Access VBA mit ADODB

dreamer2007

Mitglied
Hallo zusammen!

Ich habe ein Problem mit einem SQL-Statement, dass ich per ADODB-Recordset an eine vorhandene Access-Tabelle schicken möchte.

Komischerweisefunktioniert das gleiche Statement, zwar mit anderen Variablen, im gleichen Codeblock perfekt. Nur bei diesem String gibt es eine Fehlermeldung: "Syntaxfehler in INSERT INTO - Anweisung".

Vielleicht ja ja jemand eine Idee:

PHP:
Dim con As New ADODB.Connection
Dim RS As ADODB.Recordset
Dim str As String
Dim location  As String

location = CurrentDb.name
Verbindung Erstellen
conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & location
con.Open conStr

Set RS = New ADODB.Recordset

For i = 0 To upper_bnd Step 1
        str = "INSERT INTO costs_od_costs (AP_ID,INTERNAL_ID,siglum,process,type, "
        str = str & "description,object, costs, startdate, enddate) "
        str = str & "VALUES ('" & ap_number & "','" & i & "', '" & od_costs_array(i).siglum & "', "
        str = str & "'" & od_costs_array(i).process & "', '" & od_costs_array(i).type & "', "
        str = str & "'" & od_costs_array(i).description & "','" & od_costs_array(i).object & "', "
        str = str & "'" & od_costs_array(i).costs & "', '" & od_costs_array(i).startdate & "', '" & od_costs_array(i).enddate & "')"
        
      RS.Open str, con

Next i


Gruß

Dreamer
 
jag das sql mal direkt auf die connection über

con.execute sql

die einzige idee die ich sonst noch hätte wäre das ein als string eingegebenes Feld ein Zahlenfeld sein müsste.


Grüsse bb
 
Das Statement über
PHP:
con.Execute str
zu senden führt zu dem gleichen Problem. Zahlenfelder sind in der Tabelle vorhanden, allerding funktioniert das Einlesen als gequotete Felder in anderen Statements problemlos. Es ist eher so, dass ein fehlendes Hochkomma zu Problemen mit Double-Werten führt, da sonst das Komma als Trennzeichen für einen neuen Wert interpretiert wird.
Ich weiß wirklich nicht weiter. Vielleicht ist es auch nur ein kleiner Fehler, den ich im Moment nicht erkenne. Für weitere HIlfe oder Ideen wäre ich sehr dankbar.

Gruß

dreamer
 
Das Statement über
PHP:
con.Execute str
zu senden führt zu dem gleichen Problem.
richtig sollte damit auch nicht behoben sein, ist nur vom Stil her sauberer.
Zahlenfelder sind in der Tabelle vorhanden, allerding funktioniert das Einlesen als gequotete Felder in anderen Statements problemlos. Es ist eher so, dass ein fehlendes Hochkomma zu Problemen mit Double-Werten führt, da sonst das Komma als Trennzeichen für einen neuen Wert interpretiert wird.
auch hier wieder schlechter Stil, da man in deinem Sql nicht zwischen Zahl und String unterscheiden kann, was das fehlerfinden wiederum erschwert. Wie du vielleicht selber zugeben müsstest.

zur weiteren Fehleridentifikation könntest du ja mal die Access Datenbank anhängen und / oder mal das Datenmodell aufzeigen. Da der Sql ja deiner Meinung nach sauber ist.

PS: str ist normalerweise gleichzeitig auch eine Funktion die Verwendung als Variable halte ich auch nicht für wirklich gut

Grüsse bb
 
Zuletzt bearbeitet:
Hallo brainbyte,

danke nochmal für die Tipps zum sauberen Programmieren, werd sie gleich mal umsetzen, ich musste es tatsächlich einsehen :). Die komplette Datenbank (.mdb) kann ich leider nicht so einfach anhängen weil die genaue Struktur nicht für die Öffentlichkeit gedacht ist.
Ich hab aber mal die Struktur der ap_main in ein separates doc-File exportiert und angehängt. Vielleicht kannst du ja dort den Fehler finden.

Gruß,

Dreamer
 

Anhänge

  • ap_main.doc
    6,5 KB · Aufrufe: 110
Hallo dreamer

also mit datendefiniton wollte ich sehen wie die Tabelle definiert ist. Wie die Felder heissen kann ich ja aus deinem Insert Statement lesen. ich hätte gern mal gewusst ob zum beispiel signum ein Textfeld ist oder ein Memo oder sogar ein Währungsfeld. Genauso auch mal eine Definition deines Arrayas od_Costs_array. Hier kann man ja nur raten, was das vielleicht für Felder sind. Ich habe anhand der daten mir mal einen zusammen gereimt demnach sähe deine Tabelle ungefähr so aus:

SQL:
 AP_ID Long Integer 4
 INTERNAL_ID Long Integer 4
 siglum Text 50
 process Text 50
 type Text 50
 description Text 50
 object Text 50
 costs Währung 8
 startdate Datum/Uhrzeit 8
 enddate Datum/Uhrzeit 8

mit werten gefüllt gäbe der Sql ungefähr so etwas
SQL:
INSERT INTO costs_od_costs (AP_ID,INTERNAL_ID,siglum,process,type, description,object, costs, startdate, enddate) VALUES ('0','0', 'siglum', 'process', 'Type', 'Description','Object', '0', '06.11.2007 16:24:25', '06.12.2007 16:24:25')

Dummerweise funktioniert das von mir gemachte beispiel was mit Sicherheit daran liegt, das ich meine Testwerte im Sql so ausgewählt habe, wie es die Datentypen in der Tabelle verlangen.

Grüsse bb
 
Immer dieser Sarkasmus...hehe! Aber du hast recht!

Also nochmal zu der Tabelle, die andere war nämlich falsch! *schäm*

Code:
1. ID Autowert, Long Integer
2. AP_ID Zahl, Long Integer
3. INTERNAL_ID Zahl, Long Integer
4. siglum Text, 50
5. process Text, 50
6. type Text, 50
7. description Text, 50
8. object Text, 50
9. costs Währung, Eur
10. startdate Datum/Uhrzeit, kurz
11. enddate Datum/Uhrzeit, kurz

Grüße
 
und welche werte stehen in od_costs_array(i). drin kann es vorkommen, das in .description zum beispiel ein ' vorkommt oder so ?

ist dein od_costs_array(i) genauso definiert wie die Tabelle ?

Grüsse bb
 
PHP:
Private Type od_costs                       
    index As Integer
    description As String
    type As String
    costs As Currency
    process As String
    object As String
    siglum As String
    startdate As Date
    enddate As Date
End Type

Private od_costs_array() As od_costs

Bzgl. SQL-Injection hast du Recht. In PHP gibt es eine recht leiche Möglichkeit das zu verhindern. Verfügt VBA über ähnliche Funktionen, um die Hochkomma zu entfernen?

Gruß

Dreamer
 
Kann da so leider keinen Fehler sehen. Füg mal Folgendes in deine Schleife ein
Visual Basic:
Call InputBox("sql", "", str)
dann kann man den fehlerhaften SQL vielleicht mal genau sehen.
Bzgl.Injection gibt es in vba keine routine du kannst das ' mit Replace rausnehmen oder mit Replace ''' ( 3 x ' ) escapen.

Grüsse bb
 

Neue Beiträge

Zurück