Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADOQuery Komponente unidirektionalen Datenmenge (https://www.delphipraxis.net/164090-tadoquery-komponente-unidirektionalen-datenmenge.html)

Kevin11 28. Okt 2011 09:32

Datenbank: MS-SQL • Version: 2005 • Zugriff über: ADO

TADOQuery Komponente unidirektionalen Datenmenge
 
Hallo,

ich bekomme einen merkwürdigen Fehler bei einer SELECT Abfrage über 2 Tabellen mit einer TADOQuery Komponente.

Fehler:
Zitat:

Diese Operation ist bei einer unidirektionalen Datenmenge nicht gestattet
Query -> Connection
Query -> DataSource -> ClientDataSet -> DataSetProvider -> DataSet
DataSet -> DataSource
DataSet -> Connection

Code:
Delphi-Quellcode:
  zqPers := TADOQuery.Create(nil);
  with zqPers do
  begin
    Connection := Form2.ADOConnection;
    DataSource := Form2.DataSourceADO;
    CursorLocation := clUseServer;
    SQL.Clear;
    SQL.Add('SELECT * FROM Tabelle1, Tabelle2 WHERE Tabelle1.Feld1 = Tabelle2.Feld2 ');
    Open;
  end;
Vielen Dank.

Kevin11 2. Nov 2011 08:33

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Kann mir den niemand helfen?

Jumpy 2. Nov 2011 09:03

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Das CursorLocation mal auskommentiert?

Kevin11 2. Nov 2011 09:16

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Zitat:

Zitat von Jumpy (Beitrag 1133927)
Das CursorLocation mal auskommentiert?

Ja, ich habe alles schon versucht. Mit
Delphi-Quellcode:
SQL.Text := 'SELECT * FROM Per';
geht es problemlos und wenn ich die Join Abfrage direkt durch den Server ausführenlasse, bekomme ich auch ein Ergebnis.

Jumpy 2. Nov 2011 09:22

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
OK. Zurück. Ich hab glaub ich gar nicht verstanden, was du da machst.
Du gibst der Query eine Connection, über die sie die Abfrage an die DB schickt.

Dann gibst du ihr aber noch eine DataSource? Wieso.
Sollen die zwei Tabellen über zwei "Wege" kommen?

Kevin11 2. Nov 2011 09:25

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Also eigentlich möchte ich nur eine JOIN-Abfrage machen. Ich habe die Data Source auch weggelassen und der selbe Fehler kommt. Ich brauch ja nichts unidirektionales wenn ich nur ein SELECT machen möchte. Oder liege ich da falsch?

Gollum 2. Nov 2011 10:17

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Hallo,

der Fehler könnte die Query sein.
Funktioniert folgendes?
Delphi-Quellcode:
SQL.Text:=
  'SELECT t1.*, t2.* FROM Tabelle1 t1 INNER JOIN Tabelle2 t2 WHERE t1.Feld1 = t2.Feld2';

Kevin11 2. Nov 2011 10:48

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Hallo,

der Fehler der MS-SQL 2005 DB:
Meldung 156, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe des 'WHERE'-Schlüsselwortes.


Der Code der MS-SQL 2005 DB:
SELECT t1.*, t2.* FROM Per t1 INNER JOIN ZOrgPer t2 WHERE t1.pkPerID = t2.fkPerID

Bummi 2. Nov 2011 10:54

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Joins mit ON nicht mit Where...
kann es sein dass Du keine Primärschlüssel in den Tabellen hast?

DeddyH 2. Nov 2011 11:00

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Und an der "alten" Syntax scheint es auch nicht zu liegen. Ich habe hier einmal ein kleines Testprojekt mit ADO auf SQLExpress 2008 gemacht, das funktioniert ohne Probleme. Bist Du ganz sicher, dass das auch wirklich der fehlerverursachende Code ist?

P.S.: Welchen DB-Treiber hast Du denn ausgewählt?

Kevin11 2. Nov 2011 11:56

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Hallo,

mit der normalen Select-Abfrage geht ja alles problemlos.

ConnectionString:
Delphi-Quellcode:
Provider=SQLOLEDB.1;Password=***;Persist Security Info=True;User ID=***;Initial Catalog=datenbank;Data Source=servername
Ich greife mit ADO auf die MS-SQL Datenbank zu und schreibe es per Firebird 2.0 in eine andere aktuellere Datenbank.

Das letzte Projekt war genau das selbe, nur habe ich auf Acces via ADO Zugegriffen.

Komische Sache :?

Kevin11 3. Nov 2011 08:00

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Also ich weiß jetzt, dass wenn ich eine ADOQuery auf die Form ziehe und damit arbeite, geht alles. Hat irgendjemand schoneinmal eine ADOQuery Kompontente im Code erzeugt? Fehlen bei mir evtl. wichtige Eigenschaften?

Kevin

Bernhard Geyer 3. Nov 2011 08:05

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Zitat:

Zitat von Kevin11 (Beitrag 1133973)
Das letzte Projekt war genau das selbe, nur habe ich auf Acces via ADO Zugegriffen.

Bei Access solltest du immer mit Curserlocation clUseServer arbeiten.

Jumpy 3. Nov 2011 08:08

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Delphi-Quellcode:
procedure test;
var
  q:TADOQuery;
Begin
  q:=TADOQuery.Create(self oder nil oder ...);
  q.SQL.Text:='Select * From MyTable';
  try
    q.Connection:=MyADOConnection; //gehe mal davon aus, das MyADOConnection konfiguriert auf der Form liegt
    q.Open;
  finally
    q.Close;
End;
So würd ich das machen und so ähnlich hast du das doch auch gemacht.
Liegts vllt. an der Connection, dass du den Connection-String anders aufgebaut hast, als du die Connection auf die Form gezogen hast?

Kevin11 3. Nov 2011 08:15

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Also ich habe jetzt ein 2. Projekt neu gemacht und baue dort alles Zeile für Zeile nach und dort erzeuge ich alle Querys die ich brauche und es kommt kein Fehler.

Kevin11 3. Nov 2011 08:48

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Jetzt habe ich Probleme mit der Erstellung von dem TClientDataSet.

Delphi-Quellcode:
  zqJuInsert := TClientDataSet.Create(zqJuInsert);
  with zqJuInsert do
  begin
    ProviderName := 'Form2.DataSetProviderSQL';
    CommandText := 'SELECT * FROM JU_STAMM';
    Open;
  end;
Wenn ich den ProviderName so zuweise:
Delphi-Quellcode:
515: ProviderName := Form2.DataSetProviderSQL;
[DCC Fehler] funktionen.pas(515): E2010 Inkompatible Typen: 'string' und 'TDataSetProvider'

DeddyH 3. Nov 2011 08:54

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Was sagt die Hilfe dazu?
Zitat:

Befindet sich der Provider in derselben Anwendung wie die Client-Datenmenge, muss er dieselbe übergeordnete Komponente (Owner) wie die Client-Datenmenge besitzen. Soll ein lokaler Provider mit anderem Owner genutzt werden, verwenden Sie stattdessen die Methode SetProvider.

Kevin11 3. Nov 2011 08:59

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Zitat:

Zitat von DeddyH (Beitrag 1134178)
Was sagt die Hilfe dazu?
Zitat:

Befindet sich der Provider in derselben Anwendung wie die Client-Datenmenge, muss er dieselbe übergeordnete Komponente (Owner) wie die Client-Datenmenge besitzen. Soll ein lokaler Provider mit anderem Owner genutzt werden, verwenden Sie stattdessen die Methode SetProvider.

Ich habe es jetzt so gemacht und die Fehler Meldung bleibt gleich:
Delphi-Quellcode:
  zqJuInsert := TClientDataSet.Create(Form2.DataSetProviderSQL);
  with zqJuInsert do
  begin
    ProviderName := 'Form2.DataSetProviderSQL';
    CommandText := 'SELECT * FROM JU_STAMM';
    Open;
  end;
Fehler: Fehlernder Daten-Provider oder Datenpaket

DeddyH 3. Nov 2011 09:00

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Und das soll jetzt derselbe Owner sein? Schau nochmal genau hin.

Kevin11 3. Nov 2011 09:23

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Jetzt kommt der Fehler:

Änderung am CommandText sind nicht gestattet.

Delphi-Quellcode:
  zqJuInsert := TClientDataSet.Create(Form2);
  with zqJuInsert do
  begin
    Close;
    ProviderName := 'Form2.DataSetProviderSQL';
    CommandText := 'SELECT * FROM JU_STAMM';
    Open;
  end;

DeddyH 3. Nov 2011 09:35

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Lies doch mal hier: http://www.delphipraxis.net/95374-gr...atasource.html

Kevin11 3. Nov 2011 09:46

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Ja, aber das löst mein Problem nicht. Ich möchte nur wissen was ich machen muss, damit ich meinen CommandText ändern kann. Ich erzeuge bereits für jede Tabelle ein eigenes ClientDataSet.

DeddyH 3. Nov 2011 09:53

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Wie sehen denn die Options des Providers aus?

Kevin11 3. Nov 2011 09:57

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Also alles ist auf False von den Optionen bis auf poUseQuoteChar.

DeddyH 3. Nov 2011 09:59

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Und wenn Du poAllowCommandText noch dazu nimmst? Ich kenne mich mit dem ganzen Krams auch nicht aus, habe das aber eben im Emba-Diskussionsforum gelesen.

Kevin11 3. Nov 2011 10:05

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Jetzt ist die Meldung weg, dass man den CommandText nicht ändern kann. Ich sollte wirrklich mal lieber die ganzen Eigenschaften durchschauen, bevor ich Fragen stelle.

Der Fehler "Fehlernder Daten-Provider oder Datenpaket" kommt jetzt wieder. Form2 ist doch Eigentlich Owner von ClientDataSet und DataSetProvider. Auch wenn ich das ClientDataSet im Code erzeuge?

DeddyH 3. Nov 2011 10:06

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Das sollte so sein, aber dann musst Du das "Form2." wohl auch aus dem Namen herauslassen.

Kevin11 3. Nov 2011 10:10

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
Aber wenn ich "Form2." aus dem Namen herauslasse, dann ist Form2 ja nichtmehr der Owner.

DeddyH 3. Nov 2011 10:18

AW: TADOQuery Komponente unidirektionalen Datenmenge
 
In der Hilfe steht doch lediglich, dass beide denselben Owner haben müssen, welcher ja beim Erzeugen schon angegeben wird. Vermutlich wird der Provider dann mittels FindComponent oder so ermittelt (könnte man in den Quellen nachlesen, aber dafür fehlt mir die Zeit).


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