1

したがって、クライアントがパターンで送信するものを処理するこのコードがあります。彼が「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からデータを取得するべきではありませんか?

これは、私の知識レベルで得られる限りです。私の目には、私がしたことはすべて正しかったので、それほど難しくないことを願っています。

4

1 に答える 1

3

使用する

DS_CLIENT.SetProvider(DS_PROV);

またはDS_PROVの作成後:(現時点では、コンポーネントには実際には名前がありません)

DS_PROV.name := 'DS_PROV';
于 2009-08-13T09:17:48.987 に答える