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.
liebe dich Francis Lee :) – Acron