我目前正在测试:
我使用以下方法(借用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没有连接。
可能导致错误的原因是什么?
答案 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}}属性。