gpt4 book ai didi

Delphi ClientDataset 只读

转载 作者:行者123 更新时间:2023-12-03 15:51:15 24 4
gpt4 key购买 nike

我目前正在测试:

  1. 指向 IB 数据库的 SQLConnection。
  2. 一个 SQLDataset,其 SQLConnection 字段设置为上述字段。
  3. 将 (2) 中的 SQLDataset 作为其数据集字段值的 DatasetProvider。
  4. 一个 ClientDataset,其中 ProviderName 字段指向 (3) 中的提供程序。

我使用以下方法(借自Alister Christie)来获取数据...

function TForm1.GetCurrEmployee(const IEmployeeID: integer): OleVariant; 
const
SQLSELEMP = 'SELECT E.* FROM EMPLOYEE E WHERE E.EMPLOYEEID = %s';
begin
MainDM.SQLDataset1.CommandText := Format(SQLSELEMP, [Edit1.Text]);
Result := MainDM.DataSetProvider1.Data;
end;

它只用一条记录填充 DBGrid。但是,当我手动编辑记录时,单击“发布”,然后尝试使用

提交更改
MainDM.ClientDataset1.ApplyUpdates(0); // <<<<<< 

它会爆炸,并显示消息“SQLDataset1:无法修改只读数据集。”

我已经检查了 Provider 和 ClientDataset 的 ReadOnly 属性,并且 SQL 没有连接。

什么可能导致错误?

最佳答案

您的 ClientDataSet.Data 属性似乎是从 DataSetProvider 的 Data 属性填充的。通过您描述的设置,您应该能够简单地调用 ClientDataSet.Open,它将从 DataSetProvider 获取数据。

顺便说一句,当您调用 ClientDataSet.ApplyUpdates 方法时,DataSetProvider 的默认行为是将 SQL 查询发送到连接对象,而不是从中获取数据的 DataSet(假设是同类查询)。确保您的 DataSetProvider.ResolveToDataSet 属性未设置为 true。

最后,在一个不相关的注释中,上面的代码似乎容易受到 SQL 注入(inject)攻击(尽管我还没有对此进行测试)。使用参数来定义 WHERE 子句更安全。如果有人在 Edit1 中输入以下内容,您可能会遇到麻烦(假设 InterBase 使用 drop table 语法): 1;drop table individual;

关于Delphi ClientDataset 只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/653350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com