DB Zugriff via ADO bringt Fehler? Evt. anderer Zugriff?
-
Hallo!
Ich hab ne Datenbank auf die ich via ODBC System-DSN zugreifen muss.
OK ich hab jetzt mal nach folgender Anleitung in meinem Borland C++ 6 Builder:
http://bdn.borland.com/article/0,1410,22425,00.html
alles eingerichtet mit der Verbindung Benutzername und co. Ich kann auch noch im Designbereich vom Builder die Tabelle aktivieren und sehe in meinem DBGrid den kompletten Tabelleninhalt, nur wenn ich dann das Programm übersetze und ausführen will kommt folgende Meldung:...Exception der Klasse EVariantTypeCastError aufgetreten:
Variante des Typs (NULL) konnte nicht in Typ(String) konvertiert werden...Ich hab keine Ahnung woran das liegen kann. Bevor ich das Programm ausführe und übersetze geht doch alles noch ich seh den Tabelleninhalt komplett.
Naja wisst ihr es vielleicht oder gibt es irgend eine andere Möglichkeit auf die ODBC Treiber zuzugreifen und nicht ADO zu benutzen, wenn ja welche?? Oder glaubt ihr es liegt nicht an ADO??
MFG
Maruu
-
Hallo
die Fehlermeldung
EVariantTypeCastError
ist doch eher ein Merkmal fuer ein Cast-Problem
schau mal in deinem Code ob du irgendwo ein cast oder so drinnen hast
oder besser
Debugger verwenden um rauszufinden wo der Fehler herkommtMfG
Klaus
-
Das ist es ja ich hab eigendlich keinen Code ich hab nur die oben genannte Anleitung befolgt und die Einzelnen Elemente auf meine Unit gezogen, die DataSource und co immer in den Eigenschaften eingetragen die Tabelle in den Eigenschaften ausgewählt und das wars. Kein bisschen Code hab ich da drin. Deswegen wunderts mich ja und in der Designansicht gehts ja auch aber wenn ich es Compiliere und ausführe dann wills nimmer dann bringt er den Fehler.
Gibts da nicht ne möglichkeit das ganze von Hand zu programmieren ohne das ADo zeugs so das ich den Fehler lokalisieren kann???
Weiß auch jemand ein Beispiel wie man sowas realisieren kann??Gruß
Maruu
-
Hi,
vorweg muss ich gestehen, dass ich keine praktische Erfahrung mit ADO habe.
Aber ersetz versuchsweise ADOTable durch ADODataSet. Da muß es irgenwo etwas zum Eingegen von SQL geben (CommandText oder so ähnlich). Dort schreibst Du dann
SELECT * FROM <tabellenname>rein. Nach allesm was ich so gelesen habe sollte man vorzugsweise ADODataSet verwenden.
-
Hallo
ich wuerde es so machen
ADOConnection->ADOQuery->DataSet
- ADOConnection einstellen
- ADOQuery mit ADOConnection verbinden
- DataSet mit ADOQuery verbinden
- zB DBGrid mit DataSet verbinden
- ADOQuery mint SLQ-String fuettern
- ADOQuery->Open ....machst du das auch so ?
oder wie machst du es ?MfG
Klaus
-
Hallo!
Ok jetzt geht es erstmal!
Was ich gemacht hab ist:
ADOConnection
ADOQuery
DataSource
ADOTableSo die hab ich dann untereinander Verbunden und mach dann z.B. ne Abfrage:
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT * FROM FK_Auftrag");
ADOQuery1->Open();
Edit1->Text=ADOQuery1->FieldByName("Anschrift_Ansprech")->AsString;nach betätigung eines Buttons.
Nun hab ich aber noch folgendes Problem:
Öffne ich mit MS Access die Datenbank per ODBC dann gibts es da mehrere Tabellen. Zwei davon heisen F1_FK_Auftrag und F2_FK_Auftrag aber wenn ich bei ADOTable unter der Eigenschaft TableName schaue dann steht da zwei mal FK_Auftrag hintereinander alsoFK_Auftrag
FK_Auftraganstatt
F1_FK_Auftrag
F2_FK_AuftragWoher weiß ich welche welche ist und wie kann ich die unterschiedlich anwählen?
Auch eine SQL Abfrage z.B. mit
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT * FROM F1_FK_Auftrag");
ADOQuery1->Open();
Edit1->Text=ADOQuery1->FieldByName("Anschrift_Ansprech")->AsString;geht nicht da muss FK_Auftrag stehen.
Ich verzweifle echt.
Kann mir jemand helfen??MFG
Maruu
-
So hi!
Das mit den Tabellen hat sich erledigt das wird über den Benutzername geregeltt sorry.
Aber eine andere Frage. Gibt es eine andere möglichkeit als ADO die ODBC Treiber zu verwenden???
Ich hab nämlich das Problem das mir bei einer falschen Abfrage o.ä. immer das ganze Programm abschmiert und das würde ich gern abfangen nur scheint mir das nicht ganz so leicht, oder?
Naja und ich hab erlich gesagt auch kein plan ob es irgendwie machbar ist bei ADO den Connection String irgendwie zu verändern also z.B. Benutzername und ODBC Treiber und so geht das???? und wenn ja wie?Mir wäre sowas wie bei z.B. der MySQL-Api lieber wo ich in C, C++ ganz schön meinen Code basteln könnte mit Verbindung Initialisieren, Verbindung herstellen, Abfrage starten, Verbindung beenden.
Gibts sowas nicht auch für die gnazen ODBC Treiber um diese anzusprechen?
Ich hab mal was von recordset gelesen weiß aber nicht ob das damit zu tuin hat.Gruß
Maruu
-
Hallo
das haengt davon ab ob es fuer deine DB (???) eine API gibt
bei falscher Abfrage das ganze Programm abschmiert
das deutet aber eher auf einen Fehle rin deinem Programm hin
MfG
Klaus
-
Ne api gibts leider keine nur den ODBC Treiber. Gibt irgendwo gute Anleitungen zu ADO ich denke mal das dann ADO wohl meine einzige möglichkeit is oder???
MFG
Maruu
-
Ich möchte noch einmal darauf hinweisen, dass TADOQuery und TADOTable nur Kompabilitätskomponenten sind. In neuen Programmen haben die nichts zu suchen! Versuch doch bitte mal TADODataSet. Sollte es dann immer noch Probleme geben, liegt wohl tatsächlich ein Programmfehler vor. Aber dann müßtest Du mal ein bißchen mehr Source posten. Insbesondere die Stelle, an der es crasht.
Welche DB wird denn verwendet. Teilweise haben auch die ODBC-Treiber ihre Eigenheiten.
Maruu schrieb:
Ich hab nämlich das Problem das mir bei einer falschen Abfrage o.ä. immer das ganze Programm abschmiert und das würde ich gern abfangen nur scheint mir das nicht ganz so leicht, oder?
Was verstehst Du unter falscher Abfrage?
-
Joe_M. schrieb:
Ich möchte noch einmal darauf hinweisen, dass TADOQuery und TADOTable nur Kompabilitätskomponenten sind. In neuen Programmen haben die nichts zu suchen!
Könntest du mir bitte die Quellangaben liefern, wie du darauf kommst das TADOQuery und TADOTable Kompabilitätskomponenten sind?
Den mit TADODataSet kann man nur lesbare SELECT Abfragen starten,
dazu Quellangaben aus der BCB HilfeUse the TADODataSet component's CommandText property to retrieve the dataset, specifying either a table name or an SQL statement (SELECT only). TADODataSet is not capable of issuing Data Manipulation Language (DML) SQL statements that do not return result sets (like DELETE, INSERT, and UPDATE). For this use a component like TADOCommand or TADOQuery.
TADOQuery und TADOTable unterstützen les- und schreibbaren Zugriff auf die Abfragen/Tabellen, also haben sie ihre Daseinsberechtigung!
-
Quelle: Andreas Kosch... (der hat da schon ein paar Bücher drüber geschrieben)
TADOQuery und TADOTable sollen einem nur die Umstellung eines bestehenden Projektes, welches mit TQuery oder TTable erstellt wurde, erleichtern.
-
TADODataSet is not capable of issuing Data Manipulation Language (DML) SQL statements that do not return result sets (like DELETE, INSERT, and UPDATE). For this use a component like TADOCommand or TADOQuery.
ok dann muss wohl Borland einen Fehler in der Hilfe-Datei haben :p
und ich schon die ganze zeit Müll geschrieben haben
-
Da geht es aber um DML und nicht um Resultsets... Und für DML ich würde TADOCommand nehmen.
-
na siehste und ich nehme TADOQuery für alles

-
ja aber Du verwendest TADOQuery um Daten abzufragen (ein Result Set zu erhalten). In dem zitierten Hifetext steht aber man sollte TADOQuery oder TADOCommand verwenden um Daten zu modifizieren...
-
Joe_M. schrieb:
ja aber Du verwendest TADOQuery um Daten abzufragen (ein Result Set zu erhalten). In dem zitierten Hifetext steht aber man sollte TADOQuery oder TADOCommand verwenden um Daten zu modifizieren...
so TADOQuery aus der BCB-Hilfe
Use TADOQuery to access one or more tables in a data store using SQL statements.
Retrieve data from tables in an ADO data store using SELECT statements. Perform actions on tables and other metadata objects in an ADO data store with statements like INSERT, DELETE, UPDATE, ALTER TABLE, and CREATE TABLE. Execute stored procedures.Mit TADOQuery geht alles, also was mache ich jetzt falsch, wenn ich immer TADOQuery benutze, im Bezug auf die andere von dir favorisierten Komponenten?
-
Man kann schon mit TADOQuery arbeiten, aber es besteht die Möglichkeit, dass sich das später rächt... Warum nicht von Anfang an die richtigen Komponenten verwenden, statt mit Kompabilitätskomponenten zu arbeiten. Wenn Du dann irgendwann mal den Punkt erreicht hast, an dem TADOQuery Probleme bereitet ist das nur mit viel Aufwand zu ändern. Warum sich solch einmem Risiko aussetzen?
-
Joe_M. schrieb:
Man kann schon mit TADOQuery arbeiten, aber es besteht die Möglichkeit, dass sich das später rächt...
Wenn es darum geht, dürfte man gar nicht mehr den BCB mit den VCL benutzen,
da die Zukunft des BCB nicht grade vielversprechend ist.
-
Hey, das war nur ein gut gemeinter Rat...
Wenn Du unbedingt TADOQuery verwenden willst - bitte schön, hab' ich nix gegen. Aber wie gesagt es kann sich später bitter rächen. Und damit meine ich nicht in der nächsten BCB-Version (so es denn noch eine geben wird), sondern später im Projekt.