所以我具有该代码,其处理什么客户端发送上形成图案。如果他发送“getBENUds”,服务器发送数据集用于该表背使用SaveToString方法。

然后,将其发送到客户端。 (我使用突触)。

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的数据?

这是据我得到我的知识水平。我希望这不是太困难,因为在我的眼前,我所做的一切是正确的。

有帮助吗?

解决方案

使用

DS_CLIENT.SetProvider(DS_PROV);

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

DS_PROV.name := 'DS_PROV';
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top