したがって、クライアントがパターンで送信するものを処理するこのコードがあります。彼が「getBENUds」を送信すると、サーバーはSaveToStringメソッドを使用してこのテーブルのDataSetを送り返します。
次に、これがクライアントに送信されます。(私は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からデータを取得し、DataSetProviderはデータベースからデータを取得するADOQueryからデータを取得するべきではありませんか?
これは、私の知識レベルで得られる限りです。私の目には、私がしたことはすべて正しかったので、それほど難しくないことを願っています。