Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL - Zugriff, evtl. sogar ohne BDE (https://www.delphipraxis.net/2991-sql-zugriff-evtl-sogar-ohne-bde.html)

Evilboyz 17. Feb 2003 12:51


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??

oki 17. Feb 2003 13:45

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

MadMason 17. Feb 2003 16:20

ganz einfach:
nimm eine TSQLQuery
mit
Delphi-Quellcode:
SQLQuery1.SQL.Add('SELECT spalte FROM tabelle');
holst du dir die daten
in ne variable bekommst du sie mit
Delphi-Quellcode:
SQLQuery1.Open;
SQLQuery1.First;
variable:= SQLQuery.FieldValues['spalte'];
die funktion liefert nen variant zurück, du kannst also als VARIABLE String nehmen oder wenn du Zahlen hast Integer/Real --> wird automatisch erkannt

Touchdown 17. Feb 2003 19:29

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!

Evilboyz 18. Feb 2003 08:55

Guten Morgen und vielen Dank für die Info, so sollte es funktionieren!
Allerdings habe ich jetzt ein weiteres Problem:
In der Zeile
Code:
Form1.Query.SQL.Add('SELECT Info FROM Tab1 WHERE ID='+GetWord(sIncome, 'nx', 1));
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.
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:

Evilboyz 18. Feb 2003 09:33

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!

Hansa 18. Feb 2003 09:53

Zitat:

Zitat von Evilboyz
... 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?

Schau mal im OI nach "LoginPrompt", das steht bestimmt auf true.

Evilboyz 18. Feb 2003 10:02

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?

Gollum 18. Feb 2003 10:12

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).

Evilboyz 18. Feb 2003 10:41

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'];

Gollum 18. Feb 2003 11:02

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

Evilboyz 18. Feb 2003 11:09

Zitat:

Zitat von Gollum
hast Du die Query mit der Connection verbunden?

Ja, habe ich. Bei Ausführen bekomme ich die Meldung "CoInitialize wurde nicht aufgerufen" :freak: :shock:

Gollum 18. Feb 2003 11:29

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;

Evilboyz 18. Feb 2003 11:38

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!

Gollum 18. Feb 2003 11:53

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.

Sharky 18. Feb 2003 12:10

Zitat:

Zitat von Evilboyz
...
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'];

Von welchem Typ ist denn test in der Tabelle?
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?

Evilboyz 18. Feb 2003 12:53

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:

Sharky 18. Feb 2003 13:11

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'];

Evilboyz 18. Feb 2003 13:20

:pale:
Nein, funktioniert auch so nicht, nach wie vor der gleiche Fehler!!! Warum gibt es keinen weinenden Smiley??? :roll:

MadMason 18. Feb 2003 15:20

Zitat:

Zitat von Evilboyz
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'];

ich glaube es muss heisen
Delphi-Quellcode:
Form1.Query.SQL.Add('SELECT Info FROM Table1 WHERE test='''+GetWord(sIncome, 'nx', 1)+'''');
probiersmal so

Sharky 18. Feb 2003 15:34

Zitat:

Zitat von MadMason
ich glaube es muss heisen
Delphi-Quellcode:
Form1.Query.SQL.Add('SELECT Info FROM Table1 WHERE test='''+GetWord(sIncome, 'nx', 1)+'''');
probiersmal so

Hai MadMason,

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.

Evilboyz 18. Feb 2003 15:36

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.

ChrisF 19. Feb 2003 08:04

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

MrSpock 20. Feb 2003 07:13

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.

DSammy 25. Mai 2003 22:15

Hallo, da kann ich dir wohl helfen !

Zitat:

Zitat von Evilboyz
Allerdings habe ich jetzt ein weiteres Problem:
In der Zeile
Code:
Form1.Query.SQL.Add('SELECT Info FROM Tab1 WHERE ID='+GetWord(sIncome, 'nx', 1));
:coder:

Schreibe mal:
Code:
Form1.Query.SQL.Add('SELECT Info FROM Tab1 WHERE ID="'+GetWord(sIncome, 'nx', 1)'"');
Delphi nimmt ja das ' für die Anführungsstriche, also ist für den SQL-String hier die Zeile zuende !!!

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