Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Daten aus einer Select-Anweisung auslesen ohne DataGrid (https://www.delphipraxis.net/158312-daten-aus-einer-select-anweisung-auslesen-ohne-datagrid.html)

RWarnecke 13. Feb 2011 08:05

Datenbank: Firebird • Version: 2.1.3 • Zugriff über: Firebird .NET Provider

Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Hallo zusammen,

ich versuche mich mal wieder in Delphi Prism. Dank euch habe ich ja schon das Schreiben in eine Datenbank hinbekommen. Nur leider habe ich keinen blassen schimmer, wie ich die Daten wieder aus der Datenbank lese. Wirklich viel habe ich über Google nicht gefunden. Vielleicht habe ich auch nicht die richtigen Suchwörter eingegeben. Deshalb wäre es nett, wenn Ihr mir erklären könnt, wie ich die Daten eines SELECT-Befehls auslese und in eine ganz normale ListView schreibe. Ich möchte keine Datenbank-Komponenten (DBGrid oder ähnliches) verwenden.

Hier mein Anfang, beim Kommentar komme ich nicht weiter.
Delphi-Quellcode:
method MainForm.button2_Click(sender: System.Object; e: System.EventArgs);
var
  cmd: FbCommand;
  conn: FbConnection;
begin
  conn := new FbConnection('User ID=sysdba;Password=masterkey;' +
              'Database=111.111.111.111:/firebird/testdb.fdb; ' +
              'DataSource=111.111.111.111;Charset=NONE;');
  var SQLCommandText1 := "SELECT * FROM Details;";
  conn.Open();
  var trans := conn.BeginTransaction();
  cmd := new FbCommand(SQLCommandText1, conn, trans);
  cmd.ExecuteNonQuery();
  // Eine ListView mit den Daten befüllen
  trans.Commit();
  conn.Close();
end;

sx2008 13. Feb 2011 08:45

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Zitat:

Zitat von RWarnecke (Beitrag 1081355)
Ich möchte keine Datenbank-Komponenten (DBGrid oder ähnliches) verwenden

Du meinst du willst keine Datenbank-Controls verwenden.
Ich denke, als Delphi Programmierer sollte man hier etwas präziser sein.
Aber jetzt zur eigentlichen Frage.
Um Daten aus einer Datenbank zu lesen muss man eine Abfrage ausführen.
Query-Komponenten sind von TDataset abgeleitet und erben daher dessen Methoden und Properties.
In folgendem Beispiel werden zwei Wege gezeigt, um auf die Inhalte der Felder zuzugreifen.
Der Weg über .FieldByName().AsXXXX ist zwar aufwändiger zu schreiben, aber gerade beim
Lesen häufig nötig um die Exception "ungültige Variantumwandlung" zu vermeiden.
(denn Felder können auch "NULL" enthalten)
Delphi-Quellcode:
var
  summe : double;
begin
  // eine Query öffnen und mit einer Schleife die Werte im Feld "Preis" aufsummieren
  Query1.SQL.Text := 'SELECT * FROM Details';
  Query1.Open; // entspricht .Active := True;
  while not Query1.Eof do
  begin
    if Query1['Kategorie'] <> 'deleted' then
      summe := summe + Query1.FieldByName('Preis').AsFloat;
    Query1.Next;
  end;
  Query1.Close;
PS: da nur gelesen wird, werden keine Transactions gebraucht.

RWarnecke 13. Feb 2011 09:01

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Zitat:

Zitat von sx2008 (Beitrag 1081358)
Zitat:

Zitat von RWarnecke (Beitrag 1081355)
Ich möchte keine Datenbank-Komponenten (DBGrid oder ähnliches) verwenden

Du meinst du willst keine Datenbank-Controls verwenden.
Ich denke, als Delphi Programmierer sollte man hier etwas präziser sein.

Ja, Du hast recht. Hätte ich anders schreiben sollen. :oops:

Zitat:

Zitat von sx2008 (Beitrag 1081358)
Aber jetzt zur eigentlichen Frage.
Um Daten aus einer Datenbank zu lesen muss man eine Abfrage ausführen.
Query-Komponenten sind von TDataset abgeleitet und erben daher dessen Methoden und Properties.
In folgendem Beispiel werden zwei Wege gezeigt, um auf die Inhalte der Felder zuzugreifen.
Der Weg über .FieldByName().AsXXXX ist zwar aufwändiger zu schreiben, aber gerade beim
Lesen häufig nötig um die Exception "ungültige Variantumwandlung" zu vermeiden.
(denn Felder können auch "NULL" enthalten)
Delphi-Quellcode:
var
  summe : double;
begin
  // eine Query öffnen und mit einer Schleife die Werte im Feld "Preis" aufsummieren
  Query1.SQL.Text := 'SELECT * FROM Details';
  Query1.Open; // entspricht .Active := True;
  while not Query1.Eof do
  begin
    if Query1['Kategorie'] <> 'deleted' then
      summe := summe + Query1.FieldByName('Preis').AsFloat;
    Query1.Next;
  end;
  Query1.Close;
PS: da nur gelesen wird, werden keine Transactions gebraucht.

Diesen Teil kenne ich und habe Ihn schon x-mal angewendet. Ich will das ganze aber unter Delphi Prism machen und nicht unter Delphi.

dataspider 13. Feb 2011 09:55

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Hi,

ich nutze zwar nicht Prism, aber vielleicht nützt es ja was.

Zum Füllen eines ListView nuttze ich den DataReader.

Code:
con.Open();
FbCommand cmd = new FbCommand("select * from stat$waage where datum between '01.10.2010' and '30.10.2010'", con);
FbDataReader dr = cmd.ExecuteReader();
string str;
ListViewData.BeginUpdate();
    while (dr.Read())
    {
        str = dr["Nummer"].ToString();
        ListViewData.Items.Add(str);
    }
ListViewData.EndUpdate();
dr.Close();
Ist leider nur C# VS, aber vielleicht hilft es.

Frank

sx2008 13. Feb 2011 10:10

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Zitat:

Zitat von RWarnecke (Beitrag 1081359)
Ich will das ganze aber unter Delphi Prism machen

:oops: Ups.
Unter .NET gibt es ebenfalls ein Dataset, das aber über einen DataAdapter gefüllt werden muss.
Also so ganz grob müsste das so aussehen:
Delphi-Quellcode:
var
 adapter:FbDataAdapter;
 DetailDS:DataSet;
 aRow : DataRow;
 connection : ..
begin
  adapter := new FbDataAdapter('SELECT * FROM Details', connection);
  DataSet DetailDS := new DataSet();

  adapter.Fill(DetailDS, 'Details');

  foreach aRow in DetailDS.Tables['Details'].Rows do
  begin
    ShowMessage(aRow['EinFeld']);
  end;

Sir Rufo 13. Feb 2011 10:11

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Ich bin zwar kein Prism Experte, aber wenn ich Daten via SQL haben möchte (also ein Query) und dann einen solchen Befehl eintippe
Code:
cmd.ExecuteNonQuery
würde es mich überraschen, wenn da Daten zu mir geliefert werden.

Übersetzt heisst das ja "Ausführen aber nicht Daten holen"

RWarnecke 14. Feb 2011 06:18

AW: Daten aus einer Select-Anweisung auslesen ohne DataGrid
 
Hallo zusammen,

danke erstmal für eure Antworten. Dank dem kleinen Beispiel von DataSpider habe ich es jetzt hinbekommen. Das Schlüsselwort war ExecuteReader.

Delphi-Quellcode:
method MainForm.button2_Click(sender: System.Object; e: System.EventArgs);
var
  cmd: FbCommand;
  conn: FbConnection;
  dr: FbDataReader;
begin
  conn := new FbConnection('User ID=sysdba;Password=masterkey!;' +
              'Database=111.111.111.111:/firebird/testdb.fdb; ' +
              'DataSource=111.111.111.111;Charset=NONE;');
  var SQLCommandText1 := "SELECT * FROM Details;";
  conn.Open();
  cmd := new FbCommand(SQLCommandText1, conn);
  dr := cmd.ExecuteReader();
  ListBox1.BeginUpdate();
  while (dr.Read()) do begin
    ListBox1.Items.Add(dr[0].ToString + ' - ' + dr[1].ToString + ' - ' + dr[2].ToString);
  end;
  ListBox1.EndUpdate();
  conn.Close();
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.

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