Delphi ClientDataset只读

时间:2009-03-17 08:01:31

标签: delphi delphi-2007 readonly

我目前正在测试:

  1. 指向IB数据库的SQLConnection。
  2. 一个SQLDataset,其SQLConnection字段设置为上面的那个。
  3. 将(2)中的SQLDataset作为其数据集字段值的数据集提供程序。
  4. ClientDataset,ProviderName字段指向(3)中的提供程序。
  5. 我使用以下方法(借用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。但是,当我手动编辑记录时,单击Post,然后尝试使用

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

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

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

    可能导致错误的原因是什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

检查LiveMode的{​​{1}}属性。