![]() |
SQL - Zugriff, evtl. sogar ohne BDE
Hi,
auf Datenbanken habe ich bisher nur in PHP zugegriffen und bin deshalb, etwas verwöhnt, was das betrifft. Nun suche ich nach einer möglichst einfachen Möglichkeit, auf einen MS-SQL Server aus meinem Delphi-Code heraus zuzugreifen. Bisher habe ich TQuery verwendet und es sieht so aus, als würde alles funktionieren! Aber nun möchte ich irgendwie an die Rückgabewerte meines Select kommen und die banale Frage, wie ich das anstelle, beschäftigt mich nun schon eine ganze Weile :oops: PS: Hat irgendjemand vielleicht eine Idee, wie ich relativ einfach sogar ohne BDE zugreifen kann?? |
Hi,
es gibt im Netz freie Komponenten für die Zugriffe auf diverse Datenbanken. Ich habe selber schon mal Kompos von zeos verwendet. Leider habe ich momentan die Adresse nicht parat. Wenn Deine Suche wenig Erfolg hat, gib Bescheid. Dann frag ich einen Bekanten der die Adresse bestimmt noch hat. Über google mit dem Stichwort zeos kommst du auf jeden Fall weiter. Schau aber genau ob die Kompos frei sind. Gruß oki |
ganz einfach:
nimm eine TSQLQuery mit
Delphi-Quellcode:
holst du dir die daten
SQLQuery1.SQL.Add('SELECT spalte FROM tabelle');
in ne variable bekommst du sie mit
Delphi-Quellcode:
die funktion liefert nen variant zurück, du kannst also als VARIABLE String nehmen oder wenn du Zahlen hast Integer/Real --> wird automatisch erkannt
SQLQuery1.Open;
SQLQuery1.First; variable:= SQLQuery.FieldValues['spalte']; |
Es ist ganz einfach:
Nach Ausführen einer SQL-Anweisung, ist die Query mit dem Ergebnis dieser Abfrage gefüllt. Man kann dann die Query als Tabelle betrachen (was sie nicht natürlich nicht ist) und jeden Datensatz auswerten. Bei keinem Ergenis ist die Query leer! |
Guten Morgen und vielen Dank für die Info, so sollte es funktionieren!
Allerdings habe ich jetzt ein weiteres Problem: In der Zeile
Code:
bricht meine Anwendung mit einem Fehler ab und ich habe im Moment keine Idee, woran das liegen könnte. GetWord gibt im übrigen einen Wert zurück, die Funktion funktioniert also fehlerfrei.
Form1.Query.SQL.Add('SELECT Info FROM Tab1 WHERE ID='+GetWord(sIncome, 'nx', 1));
Was mir außerdem noch aufgefallen ist, ist die Tatsache, dass jedesmal, wenn meine Anwendung eine Verbindung zur Datenbank herstellt, ein Fenster erscheint, in dem ich zur Eingabe des Kennwortes aufgefordert werde. Kann ich dieses Fenster irgendwie umgehen, indem ich die Daten direkt in den Code schreibe? :coder: |
Naja, ich muss meine Aussage von eben etwas korrigieren, die Exception tritt bei "Query.Open;" auf, ich kann den Fehler also doch nicht so genau lokalisieren, wie ich das eben noch dachte!
|
Zitat:
|
Im OI existiert bei mir keine Eigenschaft "LoginPrompt", kann das sein??
Ich habe eine Komponente TQuery in meinem Formular und unter Databasename verweise ich auf ein Alias. Fehlt mir da noch eine zweite Komponente? |
Hallo Evilboyz,
wenn ich nicht irre, greifst Du auf einen MS-SQL-Server zu. Da Du die Enterprise-Version von Delphi 5 hast, würde ich Dir empfehlen, die ADO-Komponenten zu benutzen (sofern die bei dieser Version dabei sind). |
Ja, die ADO-Komponente ist dabei und ich hab das jetzt auch mit ADO versucht. Soweit ich das sehe, ist diese Komponente in der Handhabung weitgehend identisch mit der "normalen" TQuery. Frage am Rande: welchen Vorteil bringt mir ADO dabei?
Jedenfalls habe ich auch mit ADO noch das gleiche Problem. Mir scheint, dass ich was grundlegendes vergessen habe! Auf meinem Formular befindet sich also eine TADOQuery. Die Verbindung mit der Datenbank scheint zu funktionieren, "Verbindung testen" gibt mir auf alle Fälle grünes Licht. mein Code für den Zugriff sieht nun wie folgt aus:
Code:
Form1.Query.Active:=false;
Form1.Query.SQL.Clear; Form1.Query.SQL.Add('SELECT Info FROM Table1 WHERE test='+GetWord(sIncome, 'nx', 1)); Form1.Query.Open; Form1.Query.First; sResult:= Form1.Query.FieldList.Values['Info']; |
Hallo,
hast Du die Query mit der Connection verbunden? Vorteil: Die Komponenten arbeiten viel besser mit dem SQL-Server zusammen als die BDE-Komponenten oder sonstige Komponenten. Ein gutes Buch dazu: "Andreas Kosch - ADO und Delphi", ISBN: 3935042108 |
Zitat:
|
Hallo,
ich hatte mit diese Fehlermeldung im Zusammenspiel mit ADO noch nicht. Ich benutze ein Datenmodul und lege dort alle datensensitiven Komponenten wie Connection und Query ab. Evtl. hilft es Dir, wenn Du in der Unit, in der die ADOQuery bzw. Connection genutzt wird, folgendes einträgst:
Code:
... initialization CoInitialize(nil); finalization CoUninitialize; |
CoInitialize, etc. habe ich jetzt auch eingetragen (es gibt dazu ja auch einige Threads im Forum).
Komischerweise bekomme ich noch immer die gleiche Fehlermeldung! *verzweifel* Was macht CoInitialize eigentlich genau? Hat irgendwer eine Info darüber, die Hilfe schweigt sich da aus, bzw. erzählt mir nur Dinge, die mir absolut unverständlich sind! |
Hallo,
ich würde einmal auf der Borland-Seite vorbeischauen, ob es ein Update für ADO gibt. Außerdem kann es nicht schaden, die neueste MDAC-Version zu installieren. |
Zitat:
Wenn es ein "String" ist muss Du deinen Vergleichsoperator in zwei ' setzen. Welcher Fehler kommt den beim Query.Open? Achja, und ist sichergestellt das GetWord einen Wert zurückliefert? |
Hallo Sharky,
also, Test ist in meiner Datenbank vom Typ Char, bei Query.Open kommt der Fehler: "...Exception der Klasse EOleException aufgetreten. Meldung:'Coinitialize wurde nicht aufgerufen'" GetWord liefert immer einen Wert zurück. Coinitialize führe ich in der Unit, die Form1 definiert aus, trotzdem erhalte ich diese Fehlermeldung ... :freak: |
Versuche es doch einmal so:
Delphi-Quellcode:
Form1.Query.Active:=false;
Form1.Query.SQL.Clear; Form1.Query.SQL.Add('SELECT Info FROM Table1 WHERE test=' + QuotedStr (GetWord(sIncome, 'nx', 1))); // Hier habe ich QuotedStr eingefügt!!!! Form1.Query.Open; Form1.Query.First; sResult:= Form1.Query.FieldList.Values['Info']; |
:pale:
Nein, funktioniert auch so nicht, nach wie vor der gleiche Fehler!!! Warum gibt es keinen weinenden Smiley??? :roll: |
Zitat:
Delphi-Quellcode:
probiersmal so
Form1.Query.SQL.Add('SELECT Info FROM Table1 WHERE test='''+GetWord(sIncome, 'nx', 1)+'''');
|
Zitat:
genau dies macht die Funktion QuotedStr aus meinem Posting. Ich finde es so übersichtlicher als immer diese vielen ''''' :lol: Aber vie Evilboyz geschrieben hat geht es ja trotzdem nicht. @evilboys: Sende mir doch mal kurz dein Programm. Wenn Du die Standard-Kompos von D5-Enterpreis verwendest kann ich es mir ja mal ansehen. |
Vielen Dank für Eure Vorschläge! Leider funktionieren beide Varianten nicht :( ...
Ich glaube (ich weiß es nicht) allerdings, dass das Problem ein ganz anderes ist! Um das herauszufinden, müsste ich wissen, was Coinitialize überhaupt bewirkt, da ja die Fehlermeldung auf ein Problem damit schließen lässt. Das Internetz ist da auch nicht sehr mitteilungsfreudig. |
Huhu,
mein Senf mal kurz dabei: Die ADO-Komponenten in Delphi5 sind einigermaßen Buggy und je nach Version der msado15.dll hagelt es die tollsten Fehler :freak: Bei Borland gibbet ein entsprechendes Update für Delphi und das weiter oben erwähnte MDAC Update würde ich direkt mit installieren. Vielleicht hilft das ja. Mit dem CoInitialize bin ich noch nie in Berührung gekommen, und das obwohl ich schon ein paar ADO Anwendungen erstellt habe... Chris |
Hallo Evilboyz,
ADO steht ja für AxtiveX Data Objects. Diese stellen ihre Fähigkeiten über COM interfaces zur Verfügung, so dass sie von nahezu allen Programmiersprachen genutzt werden können. CoInitialize dient zur Initialisierung der COM Schnittstelle. |
Hallo, da kann ich dir wohl helfen !
Zitat:
Code:
Delphi nimmt ja das ' für die Anführungsstriche, also ist für den SQL-String hier die Zeile zuende !!!
Form1.Query.SQL.Add('SELECT Info FROM Tab1 WHERE ID="'+GetWord(sIncome, 'nx', 1)'"');
MfG DSammy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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-2025 by Thomas Breitkreuz