に設定されているので、クライアントがパターンを送信するコードを処理しています。彼が 'getBENUds'を送信した場合、サーバーはSaveToStringメソッドを使用してこのテーブルのDataSetを返します。Delphi:クライアントデータセット:EDatabaseError on .Open; ProviderNameが
これがクライアントに送信されます。 (私は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
...
ラインは言う:DS_CLIENT.Open例外がスローされます。
例外がスローされました:クラスEDatabaseErrorを。テキスト: 'データプロバイダまたはデータパッケージがありません'。
上記の「DS_PROV」のようにデータプロバイダが設定されているため、欠落しているデータパッケージである必要があります。
しかし、ClientDataSetは、データセットをDataSetProviderから取得して、データセットをデータベースから取得するADOQueryから取得しないでください。
これは私の知る限りではあります。私の目には、私がしたことがすべて正しかったので、あまりにも難しくないことを願っています。
はフランシスが風下あなたを愛して:) – Acron