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

发布于 2024-07-30 20:57:42 字数 2116 浏览 10 评论 0原文

所以我有这段代码来处理客户端按模式发送的内容。 如果他发送“getBENUds”,服务器将使用 SaveToString 方法发回该表的数据集。

然后,将其发送给客户端。 (我正在使用 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 获取数据,ADOQuery 从数据库获取数据吗?

这是我以我的知识水平所能得到的。 我希望这不是太难,因为在我眼里,我所做的一切都是正确的。

So I'm having this code that processes what the client sends on a pattern. If he sends 'getBENUds', the server sends the DataSet for this table back using the SaveToString method.

Then, this is sent to the client. (I'm using 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
...

The line it says: DS_CLIENT.Open an exception is thrown:

An exception has been thrown: class EDatabaseError. Text: 'missing data-provider or data package'.

The data-provider has been set as can be seen above to 'DS_PROV', so it has to be the missing data package.

But shouldn't the ClientDataSet get its data from the DataSetProvider which in turn gets it from the ADOQuery that gets the data from the database?

This is as far as I get with my level of knowledge. I hope its not too difficult, because in my eyes, everything I did was correct.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的背包 2024-08-06 20:57:42

在 DS_PROV 创建之后使用

DS_CLIENT.SetProvider(DS_PROV);

或:(此时你的组件确实没有名称)

DS_PROV.name := 'DS_PROV';

Use

DS_CLIENT.SetProvider(DS_PROV);

or after DS_PROV creation: (at this time your component has really no name)

DS_PROV.name := 'DS_PROV';
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文