Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOCommand & TADODataSet (Recordset-Objekt -> TMemo)? (https://www.delphipraxis.net/30351-tadocommand-tadodataset-recordset-objekt-tmemo.html)

Kedariodakon 23. Sep 2004 19:02


TADOCommand & TADODataSet (Recordset-Objekt -> TMemo)
 
Zitat:

Zitat von VCL - Referenz
Die Methode Execute kann bei bestimmten Befehlen auch ein Recordset-Objekt zurückgeben. Um dieses Objekt verwenden zu können, müssen Sie eine ADO-Datenmenge bereitstellen. Weisen Sie dann den Rückgabewert von Execute direkt der Eigenschaft Recordset der Datenmenge zu. Ein Beispiel:

ADODataSet1.Recordset := ADOCommand1.Execute;

So ich habe nun mithilfe von ADOCommand.Execute; einen Befehl ausgeführt, dieser wurde auch ausgeführt wie er sollte! Aber er sollte mir Ergebnisse zurückliefern was er noch nicht tut, da ich net so richtig weiß wie es geht!
Scheinbar hat das was mit einem Recordset-Objekt zu tun, wie es die Hilfe beschreibt...

Habe jetzt so ein TADODataSet Object eingebaut, ADODataSet1.Recordset := ADOCommand1.Execute; eingefühgt, meckert auch net rum, aber wie bekomm ich den Rückgabewert aus der TADODataSet Komponente raus in ein MemoFeld????

ADODataSet1.IndexFieldCount hat sich auch von 0 auf 1 Verändert nach der Anweisung, also ist auch was gemacht worden...
Finde aber nix um das nun in ein MemoFeld zu bekommen...



Kann da wer helfen?


MFG Keda

Kedariodakon 24. Sep 2004 00:24

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Ich komm damit immernoch nicht weiter :(
Brauch ich vielleicht noch eine Komponente?

plz Help :?


MFG Keda

nieurig 24. Sep 2004 07:43

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Guten Morgen,
wenn die Daten aus der DB sowieso angezeigt werden sollen würde ich gleich TADOQuery verwenden. (Nicht vergessen die Abfrage durch Open auszuführen)

Dann wird noch ein TDataSource-Object gebraucht (Registerlasche "Datenzugriff") Als DataSet wird dort die TADOQuery eingestellt.

Der Zugriff auf die Daten der Datenbank geschieht über die DBxxx Komponenten. In diesem Fall wäre das also DBMemo. Hier muß man die TDataSource Komponente und das gewünschte Feld einstellen.

und es sollte was zu sehen sein. :?

Niels

Kedariodakon 24. Sep 2004 08:03

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von nieurig
Guten Morgen,
wenn die Daten aus der DB sowieso angezeigt werden sollen würde ich gleich TADOQuery verwenden. (Nicht vergessen die Abfrage durch Open auszuführen)

Dann wird noch ein TDataSource-Object gebraucht (Registerlasche "Datenzugriff") Als DataSet wird dort die TADOQuery eingestellt.

Der Zugriff auf die Daten der Datenbank geschieht über die DBxxx Komponenten. In diesem Fall wäre das also DBMemo. Hier muß man die TDataSource Komponente und das gewünschte Feld einstellen.

und es sollte was zu sehen sein. :?

Niels

Öhm nagut, muß ich mal schaun wie du das genau meinst :)
Ich versuch es mal so umzusetzen...

Aber vielleicht gibts ja doch ne Möglichkeit die Daten aus dem Recordset des TADODataSets zu hollen, den drinne sind Sie ja scheinbar :P
Die befehle werden ja ausgeführt, seh es ja auf dem Datenbankserver, deshalb kommt ja auch was zurück und diese Rückgabewerte sind im Recordset gespeichert nur ka wie ich die da rausbekomm rausbekomm...
Das einzigste was mir halt fehlt, ist die da rauszubekommen und auf ein normales Memofeld auszugeben :P


MFG Keda

mikhal 24. Sep 2004 08:30

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Schau dir mal die Methoden FindField und FieldByName sowohl bei TAdoDataSet als auch TAdoQuery in der OH an, dann solltest du keine Probleme mehr haben, auf die Daten zuzugreifen.

Grüße
Mikhal

Kedariodakon 24. Sep 2004 08:37

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Ich werds versuchen :P
Arbeite nur zum ersten mal mit SQL-Datenbanken und hab daher 0 Ahnung davon ^^

Edit: Dafür brauch ich aber ein Feldnamen... Den hab ich aber nicht, dass ist ja das Problem...
Ich weiß nur, das sich das FieldCount von 0 auf 1 erhöht hat anch ausführen der Anweisung, also ist ein Field hinzugekommen, aber wie bekomm ich den namen vom Feld?


MFG Keda

Sharky 24. Sep 2004 08:55

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Kedariodakon
..Edit: Dafür brauch ich aber ein Feldnamen... Den hab ich aber nicht, dass ist ja das Problem.....

Hai Keda,
warum kennst Du denn nicht die Feldnamen der Tabelle?

Kedariodakon 24. Sep 2004 08:58

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Öhm woher denn?
Nach:
Delphi-Quellcode:
ADODataSet1.Recordset := ADOCommand1.Execute;
erhöht sich ADODataSet1.FieldCount von 0 auf 1...

wo soll ich da den Feldnamen herkommen??? Versteh nur noch Bahnhof....


MFG Keda

Sharky 24. Sep 2004 08:58

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
So kannst Du die Feldnamen einer Tabelle übrigens auslesen:
Ich verwende zur Anzeige eine TListBox.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Clear;
  ADOConnection1.GetFieldNames('test',ListBox1.Items);
end;
test Ist der Name der Tabelle.

Kedariodakon 24. Sep 2004 09:00

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Sharky
So kannst Du die Feldnamen einer Tabelle übrigens auslesen:
Ich verwende zur Anzeige eine TListBox.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Clear;
  ADOConnection1.GetFieldNames('test',ListBox1.Items);
end;
test Ist der Name der Tabelle.

Öhm das weiß ich, aber wie bringt mich das in meinem Problem weiter? SRY Versteh nix mehr...

Das problem was ich hab ist doch, das im Recordset von der TADODataSet komponente Sachen drinne habe die ich gern hätte, wie bringen mir da Feldnamen von der Datenbank weiter? Versteh ich nicht...
Oder werden die Rückgabewerte in der Datenbank gespeichert und nicht an mich gesendet?


MFG Keda

Sharky 24. Sep 2004 09:16

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Sorry,
das hatte ich überlesen :wall:

Mit dem ADODataSet und ADOCommand habe ich noch nicht gearbeitet. Ich verwende auch immer Querys für meine Abfragen.

Kedariodakon 24. Sep 2004 09:44

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
passiert :wink:

Naja vielleicht hätte ich auch das alles besser beschreiben sollen was ich will :)

Also mach ich das mal glatt :P


Also solange ja die xpsql70.dll und die xplog70.dll bei der MS SQL datenbank vorhanden sind gibt es z.b. den Befehl xp_cmdshell...
wenn ich jetzt in meinem TADOCommand.CommandText den string xp_cmdshell "dir c:\" übergebe und dann ADODataSet1.Recordset := ADOCommand1.Execute; aufrufe, müßte das, was ja in ner normalen win-CMD als Ausgabe bei dem befehl "dir c:\" kommt im Recordset gespeichert sein, oder sollte es, so wie ich es verstanden hab...


Aber wie bekomm ich das nu in nen TMemo rein?

Das der Befehl ausgeführt wird weiß ich, da beim Befehl: xp_cmdshell "echo Esgeht >> C:\esGeht.txt" diese EsGeht.txt ja auch angelegt wird...


Kann mir da wer helfen?

MFG Keda

mikhal 24. Sep 2004 09:44

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
In deinem CommandText sollte doch eine SQL-Anweisung stehen. Mach uns doch mal schlau: sende uns deinen CommandText, damit wir dir weiterhelfen können.

Im übrigen solltest du dich mal grundsätzlich mit der Datenbankprogrammierung auseinandersetzen. Bei Delphi-Source findest du einen Einstieg in die Materie, arbeite die Tutorials mal durch, dann sollten die größten Probleme beseitigt sein.

Grüße
Mikhal

Kedariodakon 24. Sep 2004 09:46

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von mikhal
In deinem CommandText sollte doch eine SQL-Anweisung stehen. Mach uns doch mal schlau: sende uns deinen CommandText, damit wir dir weiterhelfen können.

Im übrigen solltest du dich mal grundsätzlich mit der Datenbankprogrammierung auseinandersetzen. Bei Delphi-Source findest du einen Einstieg in die Materie, arbeite die Tutorials mal durch, dann sollten die größten Probleme beseitigt sein.

Grüße
Mikhal

Das kommt ja noch :)
Vorher habe ich abe diese Aufgabe zu lösen :?

Nur das Problem hier an sich, hat ja noch nicht wirklich was mit Datenbank-Programierung zu tun, aber irgend wie ja doch, da das ja per Datenbank pssiert...




MFG Keda

mikhal 24. Sep 2004 09:48

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Da warst du schneller...

Aber warum willst du einen DOS-Befehl über die Shell des SQL-Servers in einem Memo-Feld darstellen...

Grüße
Mikhal

Kedariodakon 24. Sep 2004 09:50

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Weils meine Aufgabe ist das zu realisieren... :wall:

Warum ich die bekomme? ka vieleicht um zu lernen, dass man bei falscher konfiguration von SQL-Servern Sehr große Sicherheitslöcher hat?
Ka da fragst mich zuviel :wink:

MFG Keda

shmia 24. Sep 2004 10:09

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Kedariodakon
Habe jetzt so ein TADODataSet Object eingebaut, ADODataSet1.Recordset := ADOCommand1.Execute; eingefühgt, meckert auch net rum, aber wie bekomm ich den Rückgabewert aus der TADODataSet Komponente raus in ein MemoFeld????

Ich empfehle folgendes:
SQL-Befehle ohne Parameter und ohne Rückgabemenge werden am Besten direkt über die Connection ausgeführt:
Delphi-Quellcode:
   ADOConnection1.Execute('DELETE FROM TABLE test');
SQL-Befehle mit Parameter aber ohne Rückgabemenge werden über TADOCommand ausgeführt:
Delphi-Quellcode:
   ADOCommand1.Commandtext := 'UPDATE test SET Status=5 WHERE CustId=:CustId';
   ADOCommand1.Parameters.ParamValues['CustId'] := '4711';
   ADOCommand1.Execute;
Stored Procedures mit Rückgabemenge werden über TADOStoredProc ausgeführt.
Delphi-Quellcode:
   ADOStoredProc1.Open; // Open, da Resultset erwartet wird
   // alle Daten auslesen und als Message anzeigen:
   s := 'Daten:'#13#10;
   while not ADOStoredProc1.Eof do
   begin
      s := s + ADOStoredProc1['Kundennummer']+#13#10;
      ADOStoredProc1.Next;
   end;
   ShowMessage(s);
Views und SELECT-Abfragen werden über TADOQuery abgefragt:
Beispiel schenk ich mir.

Kedariodakon 24. Sep 2004 10:34

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Ich weiß :wink:
Habe schon die ganzen Komponenten studiert...

Aber xp_cmdshell ist keine Stored Procedure sondern ein SQL-Befehl...

Und mit was führe ich nun SQL-Befehle mit Rückgabewert aus? Finde ich nicht in deiner Liste...
Aber soweit ich der Delphi-Hilfe folgen konnte auch mit TADOCommand, so wie ich es ja auch gemacht habe...
Habe das TADOCommand auch mit dem TADODataSet.RecordSet verbunden, damit da irgendwas mit dem Rückgabewert passiert... Nun tut sich da auch was, nur wie bekomm ich den nu raus? Nur das interessiert mich im Moment und das war auch die Frage...

Sry Wenn ich ein bischen knurrig erschein, aber Nicht wirklich irgendein Post konnte mir irgendwie weiterhelfen...
Sie verweisen auf Sachen, die ich gar nicht machen will...
Es ist zwar ne Hilfe für später, aber meine Aufgabe Im Moment ist halt diese...

Vielleicht ist das auch mit ADO - Komponenten nicht zu realisieren, dann steck ich hier in einer Sackgasse...
Aber das hat mir auch noch keiner gesagt...

Nun sitz ich hier schon seit Tagen an dem Problem und dreh mich nur im Kreis und komm allein nicht weiter und das auch noch im Urlaub...
Es läßt mir einfach keine Ruh, dass ich das net hinbekomm :cry:
Ausgeführt bekomm ich es, einen Rückgabewert bekomm ich aber net zu Gesicht, obwohl ich weiß das er da ist... :wall:

MFG Keda

Sharky 24. Sep 2004 10:57

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Hai Keda,

hast Du dein TADODataSet mit einer TDataSource verbunden?
Ich habe das eben mal getestet und es geht wunderbar. Wenn ich z.B. diesen Befehl ausführe:
Delphi-Quellcode:
  ADOCommand1.CommandText := 'xp_cmdshell "dir *.exe"';
  ADODataSet1.Recordset := ADOCommand1.Execute;
Habe ich anschließen alle Dateien in meinem DBGrid.

Kedariodakon 24. Sep 2004 11:00

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
nö hab ich net, hab auch ka wie das geht :?

aber wenn das so geht, ist das ja schon mal ein anfang ^^

Mal schaun ob ichs hinbekomm...
vielleicht kannst du genau erklären wie ich das auch hinbekomm ^^

MFG Keda

Sharky 24. Sep 2004 11:03

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Ganz einfach:
Ziehe auf deine Form eine TDataSource (Registerkarte: Datenzugriff)
Trage im OI unter "DataSet" dein ADODataSet ein.
Setze jetzt noch ein TDBGrid auf deine Form. Trage bie diesem unter "DataSource" deine DataSource1 ein.

shmia 24. Sep 2004 11:03

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Kedariodakon
Aber xp_cmdshell ist keine Stored Procedure sondern ein SQL-Befehl...

AHA !
Dann nimm mal ein TADODataset und verbinde dieses mit einer DataSource und einem DBGrid.
Natürlich auch mit einer ADOConnection verbinden.
Delphi-Quellcode:
ADODataset1.CommandText := 'EXECUTE master..xp_cmdshell '+QuotedStr('dir *.*');
ADODataset1.Active := True;
Bei mir tut's. :dancer:

Sharky 24. Sep 2004 11:06

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Halt,
kommando zurück ;-)
Es geht zwar so wie ich es beschrieben habe aber Du wolltest es ja in einem TMemo. Das ist dann noch einfacher.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOCommand1.CommandText := 'xp_cmdshell "dir *.exe"';
  ADODataSet1.Recordset := ADOCommand1.Execute;
  ADODataSet1.First;
  while not (ADODataSet1.Eof) do
  begin
    Memo1.Lines.Add(ADODataSet1.Fields.FieldByName('output').AsString);
    ADODataSet1.Next;
  end;
end;

Kedariodakon 24. Sep 2004 11:12

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
JUHU es hat fuktioniert ^^
zumindest das mit dem DBGrid dingens ..
Da steht ja nu auch wie die Tabelle heißt :)

Danke Jungens, da wär ich nie allein drauf gekommen!!!
dieses dumme DataSource dingens aber auch :P

Aufgabe erfüllt! Ich geb einen aus :P :cheers:

MFG Keda

Kedariodakon 24. Sep 2004 11:18

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
WOW das mit dem Memofeld geht ja besser als ich dachte ^^
Und das auch noch ohne Source Object :)

So nu erst mal Pause :)

Dann werd ich mal das alles analysieren ^^

Ich hab gestern auch so ähnlich rumhantiert, hatte aber nur Fehler annen kopfgeworfen bekommen...
Hatte ja keine Ahnung wie ich an den Tabellennamen hätte kommen sollen :)

gibts da irgendwas wie man hätte drankommen können ohne das im Grid abzulesen? :P


MFG Keda

Sharky 24. Sep 2004 11:23

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Kedariodakon
...gibts da irgendwas wie man hätte drankommen können ohne das im Grid abzulesen? ..

In der Onlinehilfe des MS-SQL steht es leider auch nicht. Darum habe ich den Befehl einfach im Query-Analyser des SQL-Servers ausgeführt. Schon stand der Name des Feldes (nicht der Tabelle) da ;-)

Kedariodakon 24. Sep 2004 11:29

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
ka was nen Query-Analyser ist, aber das werd ich auch noch lernen, beschäftige mich ja gerade erst mit der SQL-Problematik :)
ManManMan

bin mal gespannt, was für Probleme noch auf mich zu kommen werden :P

Also Danke erstmal! :thumb:
Wie gesagt da wär ich nie, wirklich NIE allein drauf gekommen... :pale:

Also nochmal Special THX to Shmia & Sharky the SQL Specialists!!! :spin2: :spin2: :spin2:


MFG Keda

Sharky 24. Sep 2004 11:50

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Hai,

noch ein kleiner Nachtrag ;-)
Wenn Du xp_cmdshell auf dem Server ausführst ist der Feldname absolut egal ;-)
Du kannst auf Rückgabe werte auch über den Feldindex zugreifen. Da bei xp_cmdshell maximal eine Spalte zurück gegeben wird geht es also auch ganz locker so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOCommand1.CommandText := 'EXECUTE master..xp_cmdshell ' + QuotedStr ('dir *.exe');
  ADODataSet1.Recordset := ADOCommand1.Execute;
  ADODataSet1.First;
  while not (ADODataSet1.Eof) do
  begin
    Memo1.Lines.Add(ADODataSet1.Fields.Fields[0].AsString); //Feld 0 (das erste) der Ergebnissmenge
    ADODataSet1.Next;
  end;
end;

Kedariodakon 24. Sep 2004 12:05

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
:wiejetzt: Öhm warum hast du nun EXECUTE master..xp_cmdshell genommen statt nur xp_cmdshell ???

hat das nen Grund?

MFG Keda

Sharky 24. Sep 2004 16:20

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Kedariodakon
:wiejetzt: Öhm warum hast du nun EXECUTE master..xp_cmdshell genommen statt nur xp_cmdshell ...

Das "Execute" kannst Du auch weglassen.
das master.. ist wichtig weil diese Funktion nur in dieser "Tabelle" vorhanden ist.
Hast Du die möglichkeit die OnlineHilfe des MS-SQL-Servers zu lesen?

Kedariodakon 24. Sep 2004 17:23

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Zitat:

Zitat von Sharky
Das "Execute" kannst Du auch weglassen.
das master.. ist wichtig weil diese Funktion nur in dieser "Tabelle" vorhanden ist.
Hast Du die möglichkeit die OnlineHilfe des MS-SQL-Servers zu lesen?

Nein habe ich nicht...
Kannst du mir sagen wo ich das finde bzw. herbekomme?
Vielleicht wo downloaden?
Die ist bestimmt bei Win2003-Server mit dabei oder?
dann würde ich aber auch erst übernächste Woche drankommen, da ich grad Urlaub habe :-D oder sollte... :lol:

Ich lese zur Zeit auch nur Irgendwelche Tutorials ausm I-Net, hätte mir auch schon nen Buch gekauft, bin aber Immomento net gerade flüssig :(
Und dann wüst ich net mal welches gut wär, den >2 werd ich mir erstrecht net leisten können...
Und bis jetzt hab ich immer mehr als ein Buch gekauft, da das erste bei mir irgendwie immer ein ... Griff war :P

---------

Das xp_cmdshell hat zumindest auch ohne Master.. Fumktioniert :)
zumindest auf den Testserver, wo ich testen darf ^^


Wie gesagt hab erst vor ein paar Tagen mit SQL allgemein begonnen :P
nen eigenen lokalen SQL-Server hab ich auch noch nicht zum testen, aber das kommt bald :)

Dann seh ich wenigstens gleich was ich anrichte :wink:


Achso würde zum lokalen testen auch ein MySQL-Server reichen? Im Grunde müste das doch das gleiche sein oder +- ein paar Ausnahmen?


MFG Keda

Kedariodakon 24. Sep 2004 17:42

Re: TADOCommand & TADODataSet (Recordset-Objekt -> TM
 
Ok habe was gefunden: MSDE 2000, Version A - Die kostenlose Version von SQL Server
Den werd ich mal Installieren :)

Mal schaun was es bringt :P

edit: irgendwie funzt da was net :/

MFG Keda


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