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 获取数据,后者又从从数据库获取数据的 ADOQuery 获取数据?

这是就我的知识水平而言。我希望它不会太难,因为在我看来,我所做的一切都是正确的。

4

1 回答 1

3

利用

DS_CLIENT.SetProvider(DS_PROV);

或者在创建 DS_PROV 之后:(此时你的组件真的没有名字)

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