2009-08-13 5 views
1

Also habe ich diesen Code, der verarbeitet, was der Client auf einem Muster sendet. Wenn er 'getBENUds' sendet, sendet der Server das DataSet für diese Tabelle mit der SaveToString-Methode zurück.Delphi: Clientdataset: EDatabaseError on .Open; mit ProviderName set

Dann wird dies an den Client gesendet. (Ich benutze Synapse).

procedure TTCPSocketThrd.Execute; 
var s: String; 
    strm: TMemoryStream; 
    ADO_CON: TADOConnection; 
    ADO_QUERY: TADOQuery; 
    DS_PROV: TDataSetProvider; 
    DS_CLIENT: TClientDataSet; 
begin 
    CoInitialize(nil); 
    Sock := TTCPBlockSocket.Create; 
    try 
    Sock.Socket := CSock; 
    Sock.GetSins; 
    with Sock do 
     begin 
     repeat 
      if terminated then break; 
       s := RecvTerminated(60000,'|'); 
       if s = 'getBENUds' then 
       begin 

       //ini ADO_CON 
       ADO_CON := TADOConnection.Create(Form1); 
       ADO_CON.ConnectionString := 'not for public'; 
       ADO_CON.LoginPrompt := false; 
       ADO_CON.Provider := 'SQLOLEDB.1'; 
       ADO_CON.Open; 
       //ini ADO_QUERY 
       ADO_QUERY := TADOQuery.Create(ADO_CON); 
       ADO_QUERY.Connection := ADO_CON; 
       //ini DS_PROV 
       DS_PROV := TDataSetProvider.Create(ADO_CON); 
       DS_PROV.DataSet := ADO_QUERY; 
       //ini DS_CLIENT 
       DS_CLIENT := TClientDataSet.Create(ADO_CON); 
       DS_CLIENT.ProviderName := 'DS_PROV'; 
       //SQLQUERY Abfrage 
       ADO_QUERY.SQL.Clear; 
       ADO_QUERY.SQL.Add('SELECT * FROM BENU'); 
       ADO_QUERY.Open; 
       //DSCLIENTDATASET bauen 
       strm := TMemoryStream.Create; 
       DS_CLIENT.Open; 
       DS_CLIENT.SaveToStream(strm); 
      end 
      else if s = 'getBESTEds' then 
... 

Die Linie heißt es: DS_CLIENT.Open eine Ausnahme ausgelöst: Klasse EDatabaseError:

eine Ausnahme ausgelöst wurde. Text: "fehlender Datenanbieter oder Datenpaket".

Der Datenprovider wurde so eingestellt, wie oben zu 'DS_PROV' zu sehen ist, also muss es das fehlende Datenpaket sein.

Aber sollte das ClientDataSet nicht seine Daten vom DataSetProvider bekommen, der es wiederum von der ADOQuery holt, die die Daten von der Datenbank erhält?

Dies ist, soweit ich mit meinem Kenntnisstand komme. Ich hoffe, es ist nicht allzu schwierig, denn in meinen Augen war alles, was ich tat, korrekt.

Antwort

3

Verwenden

DS_CLIENT.SetProvider(DS_PROV); 

oder nach DS_PROV Schöpfung: (zu diesem Zeitpunkt Ihrer Komponente hat wirklich keinen Namen)

DS_PROV.name := 'DS_PROV'; 
+0

liebe dich Francis Lee :) – Acron

Verwandte Themen