Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zugrif Access über ADO schreiben in Tabelle (https://www.delphipraxis.net/186925-zugrif-access-ueber-ado-schreiben-tabelle.html)

matashen 13. Okt 2015 11:02

Datenbank: Access • Version: 00 • Zugriff über: ADO

Zugrif Access über ADO schreiben in Tabelle
 
Hallo,

ich steh aufn Schlauch

Ich hab eine Tabelle, die nicht von mir ist.

Darin möchte ich Daten schreiben.

Das auslesen klappt, nur wenn ich einen Datensatz rein schreiben will bekomm ich eine Fehlermeldung.

Fehlermeldung:
Ein Parameterobjekt ist nicht ordnungsgemäß definirt.
Inkonsistente oder unvollständige Informationen wurden angegeben.

Ich hab aber keine Ahnung was die Fehlermeldung mir sagen will.

hier mal mein Code zum schreiben der Daten

Delphi-Quellcode:
procedure TOfenoption.Insert_Database(Profil: TProfildaten);
var a:String;
begin
a:='INSERT INTO RegistrationNumber(Barcode,Cbs1L1Set,Cbs1L2Set,,Cbs2L1Set,Cbs2L2Set,'+
    'CreationDate,CreationName,CreationPWLevel,CreationTime,I_Ready,'+
    'Intfc_ArrivedPulses_L1,Intfc_ArrivedPulses_L2,Intfc_GivenPulses_L1,'+
    'Intfc_GivenPulses_L2,Intfc_PcbDelayOff_L1,Intfc_PcbDelayOff_L2,'+
    'Intfc_PcbDelayOn_L1,Intfc_PcbDelayOn_L2,L_PrimaerIndex,ModificationDate,'+
    'ModificationName,ModificationPWLevel,ModificationTime,PBC_Length_1,'+
    'PBC_Length_2,'+
    'PcbJamPulses_L1,PcbJamPulses_L2,PcbL1Set,PcbL2Set,'+
    'PcbLength,Recipe,RegistrationNumber'+
    ')'+
    'VALUES('+Profil.Barcode+','+profil.Cbs1L1Set+','+profil.Cbs1L2Set+','+profil.Cbs2L1Set+','+profil.Cbs2L2Set+','+
      Profil.CreationDate+','+Profil.CreationName+','+Profil.CreationPWLevel+','+Profil.CreationTime+','+Profil.I_Ready+','+
      Profil.Intfc_ArrivedPulses_L1+','+Profil.Intfc_ArrivedPulses_L2+','+Profil.Intfc_GivenPulses_L1+','+
      Profil.Intfc_GivenPulses_L2+','+Profil.Intfc_PcbDelayOff_L1+','+profil.Intfc_PcbDelayOff_L2+','+
      Profil.Intfc_PcbDelayOn_L1+','+Profil.Intfc_PcbDelayOn_L2+','+Profil.L_PrimaerIndex+','+profil.ModificationDate+','+
      Profil.ModificationName+','+Profil.ModificationPWLevel+','+Profil.ModificationTime+','+Profil.PBC_Length_1+','+
      Profil.PBC_Length_2+','+
      Profil.PcbJamPulses_L1+','+Profil.PcbJamPulses_L2+','+Profil.PcbL1Set+','+Profil.PcbL2Set+','+
      Profil.PcbLength+','+Profil.Recipe+','+Profil.RegistrationNumber+')';
ADOQuery1.SQL.Text:=a;
ADOQuery1.execsql;
timer1.Enabled:=true;

end;
Bitte echte Hinweise und keine Links quer durchs Forum. Ich les jetzt schon den ganzen Tag zeugs was ich gegoogelt und in der Forenhilfe gefunden hab aber irgendwie find ich keine Lösung.

jobo 13. Okt 2015 11:10

AW: Zugrif Access über ADO schreiben in Tabelle
 
Das ist idR ein Datenproblem oder ein veralteter Treiber oder ein Konflikt mit irgendwelchen Constraints oder alles.
Prüfe den eingesetzten Treiber auf Aktualität. Im Bereich MS / MS Access gibt es evtl. mehrere Möglichkeiten. Es doch OLEDB oder?
Weiter kannst Du die problematische Stelle am besten per Ausschluss finden.
Eine Hälfte der Felder weglassen und versuchen, geht?, dann andere Hälfe usw.
Gerne tritt der Fehler z.B. bei "ungültigen" Datumsangaben auf "1.4.0033" usw.

matashen 13. Okt 2015 11:11

AW: Zugrif Access über ADO schreiben in Tabelle
 
Das heist ich soll erstmal prüfen welche Datentypen hinter der Tabelle stecken falls da was fieses rein gebaut wurde wo ich jetzt mit dem falschen Datentyp ran gehe?

baumina 13. Okt 2015 11:16

AW: Zugrif Access über ADO schreiben in Tabelle
 
Wahrscheinlich fehlen die Anführungszeichen für Stringwerte. Am Besten hier mit Parametern arbeiten.

matashen 13. Okt 2015 11:21

AW: Zugrif Access über ADO schreiben in Tabelle
 
Also so geht's nicht

Delphi-Quellcode:
'VALUES("'+Profil.Barcode+'","'+profil.Cbs1L1Set+'","'+profil.Cbs1L2Set+'","'+profil.Cbs2L1Set+'","'+profil.Cbs2L2Set+'","'+
      Profil.CreationDate+'","'+Profil.CreationName+'","'+Profil.CreationPWLevel+'","'+Profil.CreationTime+'","'+Profil.I_Ready+'","'+
      Profil.Intfc_ArrivedPulses_L1+'","'+Profil.Intfc_ArrivedPulses_L2+'","'+Profil.Intfc_GivenPulses_L1+'","'+
      Profil.Intfc_GivenPulses_L2+'","'+Profil.Intfc_PcbDelayOff_L1+'","'+profil.Intfc_PcbDelayOff_L2+'","'+
      Profil.Intfc_PcbDelayOn_L1+'","'+Profil.Intfc_PcbDelayOn_L2+'","'+Profil.L_PrimaerIndex+'","'+profil.ModificationDate+'","'+
      Profil.ModificationName+'","'+Profil.ModificationPWLevel+'","'+Profil.ModificationTime+'","'+Profil.PBC_Length_1+'","'+
      Profil.PBC_Length_2+'","'+
      Profil.PcbJamPulses_L1+'","'+Profil.PcbJamPulses_L2+'","'+Profil.PcbL1Set+'","'+Profil.PcbL2Set+'","'+
      Profil.PcbLength+'","'+Profil.Recipe+'","'+Profil.RegistrationNumber+'")';
oder hab ich da jetzt was falsch verstanden.
Allerdings ändert sich die Fehlermeldung in:
Syntaxfehler in der INSERT INTO-Anweisung.
Das mit den Anführungszeichen bei Stringwerten kenn ich aus den SQLite. Dachte bei Access -ADO brauch ich die nicht.

matashen 13. Okt 2015 11:25

AW: Zugrif Access über ADO schreiben in Tabelle
 
benötige ich hier etwa

QuotedStr

??

baumina 13. Okt 2015 11:32

AW: Zugrif Access über ADO schreiben in Tabelle
 
Delphi-Quellcode:
'VALUES(:Barcode, :Cbs1L1Set ....'
Ado.ParamBaName('Barcode).AsIrgendwas := Irgendwas;
so in der Art.

Jumpy 13. Okt 2015 11:35

AW: Zugrif Access über ADO schreiben in Tabelle
 
Ws kommt ja drauf an, was das für ein Feld ist, bei Strings brauchst du halt Quotes. Ob nun per Hand rein gemacht oder per QuotedStr ist ja egal. Bei z.B. Numerischen Feldern brauchst du das nicht.

Am saubersten ist es aber wohl, wenn du Parameter verwendest.

Delphi-Quellcode:
  'VALUES(:Barcode,:Cbs1L1Set,...'
 
  ADOQuery1.Parameter.paramValues['Barcode'] := Profel.Barcode;
  ADOQuery1.Parameter.paramValues['Cbs1L1Set'] := Profil.Cbs1L1Set;
  ...

quaero 13. Okt 2015 11:58

AW: Zugrif Access über ADO schreiben in Tabelle
 
In der ersten Zeile deiner Anweisung stehen zwei Komma hintereinander.

Testweise kannst du die Anfrage ja mal direkt in der Access-DB ausführen, da gibt es meist ausführlichere Fehlerbeschreibung.

p80286 13. Okt 2015 12:24

AW: Zugrif Access über ADO schreiben in Tabelle
 
Nicht zu vergessen, das "CreationDate". Ist das ein DateTime-Feld? oder ein String?
Je nachdem gibt es unterschiedliche Wege den Wert an die DB zu übergeben.

Gruß
K-H

matashen 13. Okt 2015 12:33

AW: Zugrif Access über ADO schreiben in Tabelle
 
also das mit den zwei Komma hab ich echt nicht gesehen und hat wohl den Fehler geworfen.
jetzt bekomm ich aber eine neue Fehlermeldung :cry:

Datentypen in Kriterienausdruck unverträglich.

Ist das jetzt ein hinweis auf falschen Datentyp?

Da die Tabelle nicht von mir selber erstellt ist und ich dazu keine Doku habe kenne ich die Felder nicht.
Kann ich irgendwie abfragen wie die Felder aufgebaut sind? also welche Datentypen erwartet werden?

p80286 13. Okt 2015 12:36

AW: Zugrif Access über ADO schreiben in Tabelle
 
Zitat:

Zitat von matashen (Beitrag 1318519)
Ist das jetzt ein hinweis auf falschen Datentyp?

Ja!

Wie wäre es die Tabelle in Access zu öffnen?
Dann kannst Du auch erfahren welche Datentypen die einzelnen Felder haben.

Gruß
K-H

matashen 13. Okt 2015 12:44

AW: Zugrif Access über ADO schreiben in Tabelle
 
ja schön wenn ich ein Access hier hätte....

ich bin nur der doofie der irgendwie auf die Tabelle soll um ein paar Werte einzutragen
O-Ton Cheffe:
"Das bekommst du schon hin - nur ein paar Werte das kann ja nicht so schwer sein".

naja - quäl -

gut das ich mich mit Ado und Access noch nie beschäftigt habe.

jobo 13. Okt 2015 12:53

AW: Zugrif Access über ADO schreiben in Tabelle
 
Zitat:

Zitat von matashen (Beitrag 1318522)
ja schön wenn ich ein Access hier hätte....
..

Ok, darauf muss man erstmal kommen.

Versuch mal diese Query zu öffnen, damit kann man angeblich die Struktur auslesen:
Code:
SELECT MSysObjects.Name, msysobjects.datecreate, msysobjects.dateupdate, GetTableDescr([Name]) AS Description
FROM MSysObjects
WHERE (((MSysObjects.Name) Not Like "~*") AND((MSysObjects.Name) Not Like "MSys*") and ((MSysObjects.Type)=1));
hier kommt das her
http://stackoverflow.com/questions/1...-through-query

Dann hast Du eine Chance, es richtig zu machen.

Perlsau 13. Okt 2015 12:54

AW: Zugrif Access über ADO schreiben in Tabelle
 
Zitat:

Zitat von matashen (Beitrag 1318522)
ja schön wenn ich ein Access hier hätte....

Ein bißchen Phantasie und eigene Überlegung darf man von dir aber schon erwarten, oder?
Access Viewer

jobo 13. Okt 2015 12:59

AW: Zugrif Access über ADO schreiben in Tabelle
 
Zitat:

Zitat von Perlsau (Beitrag 1318524)

Auch eine gute Idee, ich wusste nicht, ob der Tabellenstrukturen anzeigt.

p80286 13. Okt 2015 13:19

AW: Zugrif Access über ADO schreiben in Tabelle
 
Wenn Du schon aune funktionierende ADO-Abfrage hast, dann könntest Du hiermit die Feldtypen auslesen:
Delphi-Quellcode:
for i:=0 to q.Fieldcount-1 do begin
    fname:=q.fields[i].Fieldname;
    case q.Fields[i].Datatype of
      ftUnknown  :   Ftyp:=' Unknown or undetermined';
      ftString   :   ftyp:=' Character or string field';
      ftSmallint :   ftyp:=' 16-bit integer field    ';
      ftInteger  :   ftyp:=' 32-bit integer field    ';
      ftWord      :   ftyp:=' 16-bit unsigned integer field';
      ftBoolean  :   ftyp:=' Boolean field            ';
      ftFloat    :   ftyp:=' Floating-point numeric field';
      ftCurrency :   ftyp:=' Money field              ';
      ftBCD         :   ftyp:=' Binary-Coded Decimal field';
      ftDate       :   ftyp:=' Date field               ';
      ftTime       :   ftyp:=' Time field               ';
      ftDateTime :   ftyp:=' lDate and time field     ';
      ftBytes    :   ftyp:=' Fixed number of bytes (binary storage)';
      ftVarBytes :   ftyp:=' Variable number of bytes (binary storage)';
      ftAutoInc  :   ftyp:=' Auto-incrementing 32-bit integer counter field';
      ftBlob       :   ftyp:=' Binary Large OBject field';
      ftMemo       :   ftyp:=' Text memo field         ';
      ftGraphic     :   ftyp:=' Bitmap field            ';
      ftFmtMemo  :   ftyp:=' Formatted text memo field';
      ftParadoxOle:   ftyp:=' Paradox OLE field';
      ftDBaseOle :   ftyp:=' dBASE OLE field ';
      ftTypedBinary:ftyp:=' Typed binary field';
      ftCursor   :   ftyp:=' Output cursor from an Oracle stored procedure (TParam only)';
      ftFixedChar :   ftyp:=' Fixed character field ';
      ftWideString:   ftyp:=' Wide string field    ';
      ftLargeInt :   ftyp:=' Large integer field  ';
      ftADT         :   ftyp:=' Abstract Data Type field';
      ftArray       :   ftyp:=' Array field          ';
      ftReference :   ftyp:=' REF field            ';
      ftDataSet  :   ftyp:=' DataSet field        ';
      ftOraBlob  :   ftyp:=' BLOB fields in Oracle 8 tables';
      ftOraClob  :   ftyp:=' CLOB fields in Oracle 8 tables ';
      ftVariant  :   ftyp:=' Data of unknown or undetermined type';
      ftInterface :   ftyp:=' References to interfaces (IUnknown)';
      ftIDispatch :   ftyp:=' References to IDispatch interfaces ';
      ftGuid       :   ftyp:=' globally unique identifier (GUID) values ';
      else ftyp:='!not known!';
    end;{case---------------------------------}
Gruß
K-H

matashen 13. Okt 2015 13:39

AW: Zugrif Access über ADO schreiben in Tabelle
 
Hi,

hab rausgefunden das ein Wert als Zahl übergeben werden muss, dann geht's. :roll:

Danke an euch.

Es wird jetzt ein Eintrag erstellt, dann bekomm ich aber erneut eine Fehlermeldung
ADOQuery1: CommandText gibt keine Ergebnismenge zurück.

Der Eintrag an sich wird in der Datenbank aber erstellt.

Gruß Matthias

PS:Phantasie darf man natürlich erwarten - ihr glaubt ja gar nicht wie viel Phantasie ich haben kann :evil:

baumina 13. Okt 2015 13:48

AW: Zugrif Access über ADO schreiben in Tabelle
 
Wahrscheinlich machst du ein Open statt einem ExecSQL.

matashen 13. Okt 2015 13:53

AW: Zugrif Access über ADO schreiben in Tabelle
 
nö, mach brav ein execsql

matashen 13. Okt 2015 13:58

AW: Zugrif Access über ADO schreiben in Tabelle
 
Ich schließ jetzt einfach die Datenbank nachm schreiben und mach die Verbindung neu dann geht's ohne Fehlermeldung.

baumina 13. Okt 2015 14:32

AW: Zugrif Access über ADO schreiben in Tabelle
 
Vielleicht setzt Active auf true, das wäre dann das gleiche wie Open.

matashen 13. Okt 2015 15:04

AW: Zugrif Access über ADO schreiben in Tabelle
 
ja das wars, Dankeschön.

Das Query stand noch auf active.

Danke an euch allen habt mir sehr geholfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz