Entwickler-Ecke

Datenbanken - Datenbank mit DataSourceund DataSet auslese


HenryHux - Do 11.11.10 22:27
Titel: Datenbank mit DataSourceund DataSet auslese
Hi,

ich finde leider keine Informationen über das Auslesen von TDBGrids, mit denen ich was anfangen kann.
Aber soweit ich es verstanden hab, kann ich die nicht einfach wie ein TStringGrid auslesen.
Habe gefunden, dass ich DBGrid.DataSource.DataSet nehmen soll, doch kann ich damit auch nichts genaueres anfangen.
Angenommen ich will aus einer Datenbak den Wert Vornamen beim ersten Datensatz auslese, wie mache ich das?

Delphi-Quelltext
1:
vorname:=datenbank.DBGrid1.DataSource.DataSet.cells[1,1];   //So würde ich es machen, aber leider ist da der Compiler nicht meiner Meinung :D                    


Lg

Henry


Moderiert von user profile iconMartok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 11.11.2010 um 21:29


jaenicke - Do 11.11.10 22:41

Moment mal, was willst du denn jetzt eigentlich machen? Daten anzeigen oder Daten im Programm auslesen und verarbeiten? :gruebel:

Denn Daten über ein DBGrid zur Verarbeitung auszulesen ist als ob du einen Film mit einem Beamer an eine Leinwand strahlst und dann mit einer Webcam die Pixel ausliest (statt direkt aus den Daten zu lesen).

Also was hast du denn vor?


HenryHux - Do 11.11.10 22:46

:D Ok verstehe, hatte mir die Tabelle nur angelegt um die Connection zu überprüfen.
Ich will die Datenbank direkt auslesen.

Lg


jaenicke - Do 11.11.10 23:02

Das kommt dann noch ganz darauf an wie du wo drauf zugreifst. Ein Beispiel mit ADO und einer Query (ohne Fehlerbehandlung, die fehlt noch!):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  MyADOQuery.SQL.Text := 'select col from test where a=true';
  MyADOQuery.Open;
  for i := 0 to MyADOQuery.RecordCount - 1 do
  begin
    ShowMessage(MyADOQuery.FieldByName('col').AsString);
    MyADOQuery.Next;
  end;


bummi - Do 11.11.10 23:09

@jaenike
for i := 0 to......

habe ich im Zusammenhang mit Datasets noch nie gesehen :shock:
wieso nicht while not EOF ?


HenryHux - Do 11.11.10 23:11

Hmm habe davon leider kein Wort verstanden, bin noch dabei mich damit auseinanderzusetzen.
Alles was ich sagen kann ist, dass ich es eig genauso wie hier hab : http://www.tutorials.de/sonstige-videotutorials/161698-delphi-zugriff-auf-access-datenbank-3-23-a.html .
Vlt hilft das ja. Kannst du mir vlt erklären was der Quelltext bedeutet? =)

Lg


Xion - Do 11.11.10 23:19

Das Tutorial da ist ja nur so ne Angabe von Delphi, wie du ohne Programmieren an die Datenbank ran kommst. Das ist aber größtenteils ungeeignet, wenn du wirklich programmieren willst.

Access -> Du musst die ADO Komponenten verwenden.

Mit einer Query Komponente (TADOQuery?) kannst du dann SQL-Befehle an die Datenbank senden und kriegst eine Tabelle zurück.

Das macht user profile iconjaenicke in seinem Code oben.

Du kannst einfacher erstmal die ADOTable ansprechen. Dort gibt es auch eine Filter (und eine Locate?) Operation.

Die ADOTable kannst du auch in etwa wie user profile iconjaenicke geschrieben hat ansprechen, nur ohne der ersten Zeile natürlich.

//Edit:
Alle Werte einer Spalte in ein Memo schreiben müsste per Table in etwa so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Table.Active:=True; //Mit Datenbank verbinden
Table.First; //ersten Eintrag wählen
while not Table.EoF do
  begin
     Memo1.Lines.Add( Table.FieldByName('MeineDatenbankspalte').AsString);
     Table.Next; //nächsten Eintrag wählen
  end;
Table.Close;


jaenicke - Do 11.11.10 23:22

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
habe ich im Zusammenhang mit Datasets noch nie gesehen :shock:
wieso nicht while not EOF ?
Macht doch keinen Unterschied. Die Abfrage wird ohnehin zuerst komplett ausgeführt. :nixweiss:

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Hmm habe davon leider kein Wort verstanden, bin noch dabei mich damit auseinanderzusetzen.
Kein Wunder, wenn du nur so ein Video anschaust. Wie soll man davon etwas lernen?

Du musst schon lesen. Zum Beispiel die Hilfe zu den Komponenten.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst einfacher erstmal die ADOTable ansprechen. Dort gibt es auch eine Filter (und eine Locate?) Operation.
Dafür ist die aber wohl auch langsamer als die Query. Dass die Table mehr kann, ist klar.

// EDIT:
Du kannst sowohl bei einer Query als auch bei einer Table mit Open und Active arbeiten, ganz wie du willst. Mein Code oben geht für beide, sind ja beides TDataSet Nachkommen. ;-)


HenryHux - Do 11.11.10 23:30

Ok, danke, habe es so jetzt hinbekommen, dass er mir alle Werte einer bestimmten Spalte ausgibt.

Ungefähr so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TDatenbank.Button1Click(Sender: TObject);
var
i : integer;
begin
  adotable1.Open;
  for i := 0 to adotable1.RecordCount - 1 do
  begin
    ShowMessage(adotable1.FieldByName('Name').AsString);
    adotable1.Next;
  end;
end;


Habe die Tabelle so angeordnet, dass jede Zeile eine ID hat. Wie kriege ich denn einen Wert aus einer Zeile, deren ID ich kenne?

Lg


jaenicke - Do 11.11.10 23:42

Siehe oben in meinem Quelltext, das kannst du in die SQL Abfrage stecken.

Alternativ kannst du in einer Table, wie du sie ja nutzt, auch direkt einen Filter setzen.


HenryHux - Fr 12.11.10 14:11

Hmm sry, aber ich blick gar nicht durch.
Bei mir sagt er [DCC Fehler] Database.pas(36): E2003 Undeklarierter Bezeichner: 'SQL'.
Muss ich da noch irgendwas einbinden?
Könnte mir evlt jemand ein Beispiel zeigen, an dem ich einfach nur anhand von der Nummerierung in der DB eine Zelle aus dieser Zeile auslesen kann?
Habe viel im Internet gesucht, aber nicht gefunden, was mir helfen würde...
Und die Delphi Hilfe sagt mir auch nicht gerade viel.

Lg

Henry

EDIT:

Habe das hier gefunden, klappt auch ganz gut, aber bräuchte jetzt mehr Ergebnisse, als nur nen Bool-Wert.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TDatenbank.Button1Click(Sender: TObject);
 var
   LocateSuccess: Boolean;
   SearchOptions: TLocateOptions;
 begin
   SearchOptions := [loPartialKey];
   LocateSuccess := adotable1.Locate('ID''7', SearchOptions);
   if locatesuccess then
    showmessage('TRUE')
   else 
    showmessage('False');
 end;
end.


HenryHux - Fr 12.11.10 14:33

So, habs jetzt hinbekommen.
Habe dafür Lookup benutzt.
Vlt brauchs ja nochmal jemand =)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TDatenbank.Button1Click(Sender: TObject);
 var
   erg:variant;
 begin
    erg:=adotable1.Lookup('ID'1'Nickname'); 
    showmessage(erg);
 end;


Lg