Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi SQL query (https://www.delphipraxis.net/154826-sql-query.html)

value is NULL 27. Sep 2010 12:45

SQL query
 
Hallo Delphianer

Bin gerade dabei mich mit SQL Query's zu beschäftigen, jedoch finde ich nur anleitungen für Form basierte Programme,
Hat jemand einen heißen tipp für mich?

danke schon mal

LG

Die Muhkuh 27. Sep 2010 12:53

AW: SQL query
 
Was willst Du wissen?

Wie man SQL-Querys im Allgemeinen schreibt?

value is NULL 27. Sep 2010 12:59

AW: SQL query
 
ja generell, habe gerade gesehen das es folgendes gibt:

Delphi-Quellcode:
uses
   SysUtiils,
   db,
   adodb;
SQL Technisch bin ich gut bewandert nur die connection zu einer lokalen MSDE ist bei mir ein großes Fragezeichen, bzw. den Output des Query's in eine variable schreibe

LG

p80286 27. Sep 2010 13:11

AW: SQL query
 
Zitat:

Zitat von value is NULL (Beitrag 1052314)
.... bzw. den Output des Query's in eine variable schreibe

Hier geistern recht viele Beispiele herum.
Such einmal nach Sql.Text, .Open, .Next etc.
Da wird dann auch gründlich diskutiert warum man etwas so und nicht anders machen sollte.

Gruß
K-H

P.S.
Wo hakt es denn konkret?
TADOConnection und TADOQuery auf das Form geklatscht, Die Connectionparameter zusammengeklickt, Connection und Query verbunden, fertig!

Hansa 27. Sep 2010 13:12

AW: SQL query
 
Du brauchst nicht mal eine einzige Form ? :shock: Aber egal, ob mit oder ohne Form, das Stichwort lautet DataModule. Das braucht keine Form. Kurzanleitung (ohne Form) : auf das Datamotule kommen TDatabase, TTransaction, TDataSet. Im OI muss dann noch alles eingestellt werden. Database zuweisen usw. Du siehst : ohne Form ist (fast) wie mit der Form. :lol: Variable wäre dann ungefähr so zuzuweisen :
Delphi-Quellcode:
i := DataSet1.FieldByName ('INTVAR').AsInteger;

value is NULL 27. Sep 2010 13:14

AW: SQL query
 
ne soll ja ne commandline app werden :)

so habe durch goolge wieder einiges erfahren
mein code sieht aktuell so aus:

Delphi-Quellcode:
var
  Conn : TADOConnection;
  Query: TADOQuery;

begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=MSSQL;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=EnvironmentSafe;Data Source=test';
  Conn.Connected := true;

  Query := TADOQuery.Create(nil);
  Query.Connection := Conn;
  Query.SQL.Add('select count(*) from tbuser');
  Query.Active := true;

except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;

end.
er sagt mir aber ständig:

"Der Provider kann nicht gefunden werden." es ist eine MSDE2000

hat jemand eine idee wie ich den Provider für die MSDE angeben muss?

LG

value is NULL 27. Sep 2010 13:41

AW: SQL query
 
Zitat:

Zitat von value is NULL (Beitrag 1052318)
ne soll ja ne commandline app werden :)

so habe durch goolge wieder einiges erfahren
mein code sieht aktuell so aus:

Delphi-Quellcode:
var
  Conn : TADOConnection;
  Query: TADOQuery;

begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=MSSQL;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=EnvironmentSafe;Data Source=test';
  Conn.Connected := true;

  Query := TADOQuery.Create(nil);
  Query.Connection := Conn;
  Query.SQL.Add('select count(*) from tbuser');
  Query.Active := true;

except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;

end.
er sagt mir aber ständig:

"Der Provider kann nicht gefunden werden." es ist eine MSDE2000

hat jemand eine idee wie ich den Provider für die MSDE angeben muss?

LG

also ich habs jetzt schon mit:
Provider=MSSQL / MSDE / SQL probiert aber kein erfolg, gibt es ne andere Möglichkeit? oder hat wer eine Idee zum Provider?

DeddyH 27. Sep 2010 13:47

AW: SQL query
 
Mach Dir doch schnell ein Testprojekt, packe dort eine TADOConnection aufs Form und lass Dir den ConnectionString generieren. Evtl. funktioniert der "Microsoft OLE DB Driver for SQL Server", zumindest bei SQLExpress 2008 bekomme ich damit eine Verbindung.

schlecki 27. Sep 2010 13:54

AW: SQL query
 
du kannst dir auch einfach eine leere datei erstellen, die du "Test.udl" nennst.
Dann einen Doppelklick darauf, und der Editor geht auf, in dem du ganz bequem alles einstellen kannst. Du kannst sogar diese UDL-Datei in dem Connectionstring angeben und so die Verbindung über die Datei nutzen (anstatt hard-coded)...

value is NULL 27. Sep 2010 14:10

AW: SQL query
 
Hi Schlecki habs jetzt im endeffekt eh so zum testen:

Delphi-Quellcode:
begin
opt.addoption('provider','p','provider',false,true,'','Set provider path');
  try
    opt.parse;
    if paramcount = 0 then
      raise exception.Create('Parameter missing!');
   except
      on e : exception do begin
        writeln(e.message);
        writeln(opt.usage);
        halt(1);
      end;
   end;

provider := opt.getoptasstr('provider');


try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider='+provider+';Password=;Persist Security Info=True;User ID=sa;Initial Catalog=EnvironmentSafe;Data Source=voxctv3';
  Conn.Connected := true;

//  Query := TADOQuery.Create(nil);
//  Query.Connection := Conn;
//  Query.SQL.Add('select count(*) from tbcall');
//  Query.Active := true;

except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;

end.
ich versuche es jetzt mal wie DeddyH gemeint hat...

joachimd 27. Sep 2010 14:11

AW: SQL query
 
Zitat:

Zitat von schlecki (Beitrag 1052324)
du kannst dir auch einfach eine leere datei erstellen, die du "Test.udl" nennst.
Dann einen Doppelklick darauf, und der Editor geht auf, in dem du ganz bequem alles einstellen kannst. Du kannst sogar diese UDL-Datei in dem Connectionstring angeben und so die Verbindung über die Datei nutzen (anstatt hard-coded)...

...und auf diese Weise herausfinden, dass der provider SQLOLEDB.1 heißt;)

value is NULL 27. Sep 2010 14:27

AW: SQL query
 
Also, ich bin nun zu foldendem Teilerfolg gekommen mit folgendem Code:

Delphi-Quellcode:
var
  Conn : TADOConnection;
  Query: TADOQuery;
  provider : string;

begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info = False;Initial Catalog=test;Data Source=localhost';
  Conn.Connected := true;

  Query := TADOQuery.Create(nil);
  Query.Connection := Conn;
  Writeln(Query.SQL.Add('select count(*) from tbuser'));
  Query.Active := true;

except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;

end.
Wenn ich diesen Query abschieße: Writeln(Query.SQL.Add('Select count(*) from tbuser')); bekomme ich 0 zurück ich habe jedoch 17 einträge? ist das eventuell der Fehlercode?
wenn ja wie bekomme ich den Output des Query's?

Vielen Dank im Voraus!

PS: für die MSDE wird SQLOLEDB.1 verwendet

LG

Hansa 27. Sep 2010 14:42

AW: SQL query
 
Du setzt ja das active := true; auch zu spät. 8-)

value is NULL 27. Sep 2010 14:47

AW: SQL query
 
und wo gehört das active hin?

p80286 27. Sep 2010 15:01

AW: SQL query
 
ich würde es ungefähr so machen

Delphi-Quellcode:
query.close;
query.sql.text:='select count(*) as Meinwert from mytable';
query.open;
while not query.eof do begin
  meinWert:=query.fieldbyname('Meinwert').asinteger;
  query.next;
end;
query.close;
Ist natürlich meistens Blödsin mehrere Werte (wenn vorhanden) in eine Variable auszulesen.
Ist aber als Grundstruktur ganz brauchbar.

Gruß
K-H

value is NULL 27. Sep 2010 15:18

AW: SQL query
 
das prinzip verstehe ich nicht

wieso sieht der query so aus:
Delphi-Quellcode:
query.sql.text:='select count(*) as Meinwert from mytable';
bzw. warum dieses zeile?
Delphi-Quellcode:
meinWert:=query.fieldbyname('Meinwert').asinteger;
ich will ja nur einen Wert oder ein count absetzen wie zB:
select count(*) from tbuser oder
select username from tbuser

LG

GHorn 27. Sep 2010 15:50

AW: SQL query
 
Wie Hansa schon schrieb:

Zitat:

Zitat von Hansa (Beitrag 1052338)
Du setzt ja das active := true; auch zu spät. 8-)

Du musst doch erst das Ergebnis einlesen bevor Du es mit WritLn() ausgeben kannst. Der active-Befehl schickt Dein
select-statement auf die Reise.

So sollte es gehen:


Delphi-Quellcode:
query.sql.text:='select count(*) as Meinwert from mytable';
query.Active := true;
WriteLn(query.FieldByName('Meinwert').AsString);

value is NULL 27. Sep 2010 15:58

AW: SQL query
 
hm alles klar :) so funktionierst

Delphi-Quellcode:
var
  Conn : TADOConnection;
  Query: TADOQuery;
  wert : string;

begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info = False;Initial Catalog=test;Data Source=localhost';
  Conn.Connected := true;

  Query := TADOQuery.Create(nil);
  Query.Connection := Conn;
  query.SQL.Text := 'select count(*) as wert from tbuser';
  query.Active := True;
  Writeln(query.FieldbyName('wert').asstring);

except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;

end.
aber das mit dem
Delphi-Quellcode:
query.SQL.Text := 'select count(*) as wert from tbcall';
ist für mich irgendwie unlogisch :)
dh. ich setze praktisch in meinem query die variable?

LG und DANKE

value is NULL 27. Sep 2010 16:27

AW: SQL query
 
Hab jetzt versucht mir das ganze zu vereinfachen und eine unit zu schreiben:

Delphi-Quellcode:
unit sqlst;

interface

uses
  SysUtils,db,adodb,activex;

function connect(): string;
function query(query : string) : string;
function close(): string;

var
  conn : TADOConnection;
  query1 :TADOQuery;

IMPLEMENTATION

function connect(): string;
begin
try
  CoInitialize(nil);
  Conn := TADOConnection.Create(nil);
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info = False;Initial Catalog=test;Data Source=localhost';
  Conn.Connected := true;
except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;
end;

function query(query : string) : string;
begin
try
  query1 := TADOQuery.Create(nil);
  query1.Connection := Conn;
  query1.SQL.Text := query;
  query1.Active := True;
except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;
end;

function close(): string;
begin
try
  query1.SQL.Clear;
  query1.close;
except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;
end;


end.
ABBEERR ich habe ja nun das problem, das ich an dieser stelle:
Delphi-Quellcode:
function query(query : string) : string;
begin
try
  query1 := TADOQuery.Create(nil);
  query1.Connection := Conn;
  query1.SQL.Text := query;
  query1.Active := True;
except
  on e : exception do begin
    writeln(e.message);
    halt(1);
  end;
end;
end;
und zwar genau an dieser Stelle
Delphi-Quellcode:
 query1.SQL.Text := query;
ich muss hier ja auch diesen wert überegeben... wie könnte ich das lösen?

mir fehlt praktisch diese zeile:

Delphi-Quellcode:
 query.FieldbyName('wert').asstring
LG und DANKE

DataCool 27. Sep 2010 17:05

AW: SQL query
 
Hi,

Du solltest den Parameter der Funktion nicht genauso wie die Funktion selber nennen !

Delphi-Quellcode:
function query(sQuerySQL : string) : string;
Var oTmpQry : TAdoQuery;
begin
oTmpQry := TADOQuery.Create(nil);
try
  try
    oTmpQry.Connection := Conn;
    oTmpQry.SQL.Text := sQuerySQL;
    oTmpQry.Active := True;
    result := oTmpQry.FieldbyName('wert').asstring
  except
    on e : exception do begin
      writeln(e.message);
      halt(1);
    end;
  end;
Finally
  oTmpQry.free;
end;
end;
Greetz Data

p80286 27. Sep 2010 18:16

AW: SQL query
 
Zitat:

Zitat von value is NULL (Beitrag 1052357)
das prinzip verstehe ich nicht

wieso sieht der query so aus:
Delphi-Quellcode:
query.sql.text:='select count(*) as Meinwert from mytable';
bzw. warum dieses zeile?
Delphi-Quellcode:
meinWert:=query.fieldbyname('Meinwert').asinteger;
ich will ja nur einen Wert oder ein count absetzen wie zB:
select count(*) from tbuser oder
select username from tbuser

LG

hiermit definierst Du nur die Abfrage:
Code:
query.sql.text:='select count(*) as Meinwert from mytable';
in diesem speziellen falle wird wohl nur ein wert zurück geliefert werden, und zwar die Anzahl der Zeilen/Datensätze in "Meinwert".

Mit
Code:
meinWert:=query.fieldbyname('Meinwert').asinteger;
wird aus einer Antwortzeile das Feld "Meinwert" ausgelesen und in meinwert gespeichert.

vielleicht wird es so etwas klarer:
Delphi-Quellcode:
var
  NamensListe : tstringlist;
...
Namensliste:=tstringlist.create;
...
query.close;
query.sql.text:='select Name as Famname from mytable'; // Definition der Query
query.open;                                            // Ausführen der Query
while not query.eof do begin                           // Solange es Daten gibt
  Namensliste.add(query.fieldbyname('Famname').asinteger); // in Liste speichern
  query.next;                                          // nächster Datensatz
end;
query.close;                                           // schließen!
Dann erhällst Du als Ergebnis eine Stringliste, in der alle Namen enthalten sind.

Gruß
K-H

GHorn 28. Sep 2010 08:08

AW: SQL query
 
In #19 schreibst Du 3 Funktionen, die jeweils als Rückgabewert
einen String haben sollen. Allerdings passiert da nichts. Nirgendwo ein
Delphi-Quellcode:
 Result := 'Blabla'
Dann kannst Du auch gleich eine procedure draus machen. Oder
Du gibst etwas sinnvolles zurück, was in der aufrufenden Routine auch verwertet wird.

Wie universell sollen denn Deine Funktionen sein. Dienen sie nur
dazu, das count(*) zurückzugeben oder soll das eine Art Blackbox
werden? Wenn letzteres, musst Du das Ganze noch etwas aufbohren.
Ich denke, Beispiele findest Du hier in der DP bis zum Abwinken.

value is NULL 28. Sep 2010 08:42

AW: SQL query
 
Hi Data

habe die function soeben probiert, bekomme aber ständig: "Field 'wert' not found" zurück

was will er da von mir?

LG und DANKE!

PS: P80286 Danke für die Erklärung, es ist nun wesentlich deutlicher !

DeddyH 28. Sep 2010 09:01

AW: SQL query
 
Hast Du in der Abfrage auch einen Alias namens "wert" vergeben?

DataCool 28. Sep 2010 09:22

AW: SQL query
 
Zitat:

Zitat von value is NULL (Beitrag 1052530)
Hi Data

habe die function soeben probiert, bekomme aber ständig: "Field 'wert' not found" zurück

was will er da von mir?

LG und DANKE!

PS: P80286 Danke für die Erklärung, es ist nun wesentlich deutlicher !

Hi,

das Feld 'Wert' in der von mir geschriebenen Function war nur als Platzhalter gedacht !
Wenn Du z. B. einen SQL hast: "Select Count(*) as Anz from tablenname"
dann müßte in meiner function 'Wert' mit 'Anz' ersetzt werden,
also der Name des gesuchten Feldes den Du auslesen möchtest.

Greetz Data

value is NULL 28. Sep 2010 09:33

AW: SQL query
 
hm, und was sagt mir das jetzt? :(
steh gerade an

LG

DeddyH 28. Sep 2010 09:46

AW: SQL query
 
Ohne Alias:
Delphi-Quellcode:
Query.SQL.Text := 'SELECT COUNT(*) FROM Tabelle';
Query.Open;
IntVar := Query.Fields[0].AsInteger;
Mit Alias:
Delphi-Quellcode:
Query.SQL.Text := 'SELECT COUNT(*) AS Anzahl FROM Tabelle';
Query.Open;
IntVar := Query.FieldByName('Anzahl').AsInteger;
Im letzteren Fall kannst Du über FieldByName über das benannte Feld zugreifen.

value is NULL 28. Sep 2010 12:16

AW: SQL query
 
cool :)

so hats geklappt :)

Delphi-Quellcode:

function query(sQuerySQL : string) : string;

begin
oTmpQry := TADOQuery.Create(nil);
try
  try
    oTmpQry.Connection := Conn;
    oTmpQry.SQL.Text := sQuerySQL;
    oTmpQry.Active := True;
    result := oTmpQry.Fields[0].asString;
  except
    on e : exception do begin
      writeln(e.message);
      halt(1);
    end;
  end;
Finally
  oTmpQry.free;
end;
end;
ich danke euch VIELMAS!!!!

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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