Delphi:Clientdataset:.Open上的EDatabaseError;设置ProviderName

时间:2009-08-13 08:43:05

标签: delphi tclientdataset

所以我有这个代码来处理客户端在模式上发送的内容。如果他发送'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中获取数据吗?

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

1 个答案:

答案 0 :(得分:3)

使用

DS_CLIENT.SetProvider(DS_PROV);

或创建DS_PROV之后:(此时您的组件确实没有名称)

DS_PROV.name := 'DS_PROV';