Datasnap - 使用参数插入记录

时间:2014-08-10 23:10:21

标签: delphi datasnap

在DatasnapServer上我有: TSQLConnection连接到我的数据库。 SQLDataset1(CommandType = ctQuery)从我的表中获取数据(让我们称之为" RESORTS"。 DataSetProvider1连接到我的SQLDataset1。 DataSetProvider1设置为AllowCommandText。

这很好用。服务器启动没有问题。获得数据。

在客户端,我有: 连接的SQLConnection1 OK.Driver是Datasnap。 DSProviderConnection1链接到我的SQLConnection1。 两者都没有问题。 然后我有DataSource1连接到ClientDataSet1。 ClientDataSet1连接到我的DataSetProvider1。 将其设置为活动将从服务器检索数据。 全部显示在网格中。

在客户端表单上,我有一个Edit1和一个Button1。 我尝试使用ClientDataset1

运行查询
procedure TForm2.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
ClientDataSet1.CommandText := ' INSERT INTO RESORTS (RES_NAME) VALUES (:RN)';
ClientDataSet1.FieldByName('RN').AsString := Edit1.Text;
ClientDataSet1.Execute;
ClientDataSet1.Open;
end;

我得到:ClientDataSet1:Field' RN'没找到。

所以,我想知道发生了什么事?为什么我不能用参数插入数据? 如果我用以下参数替换参数: ClientDataSet1.CommandText:='插入度假村(RES_NAME)价值观("尝试")&#39 ;; 我得到:远程错误:SQLDataSet1:不从Query返回光标。 但是,数据确实已插入。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

(根据海报在评论中提供的新信息重写。)

你的整个方法都是错误的。 :-)您不使用参数,SQL或CommandTextTClientDataSet.CommandText documentation清楚地说:

  

CommandText指定客户端数据集希望从其(内部或外部)提供程序接收的数据。它是:

     
      
  • 要执行的数据库服务器的SQL语句(查询)。
  •   
  • 表或存储过程的名称
  •   

SQL语句(查询)表示只有SELECT是可接受的SQL。 INSERT不是查询,因此无法在CommandText中用于插入数据。

要在TClientDataSet中插入数据,只需InsertAppend,然后使用FieldByName设置值,然后调用Post方法:

ClientDataSet1.Insert;
ClientDataSet1.FieldByName('RES_NAME').AsString := Edit1.Text;
ClientDataSet1.Post;

要进行修改,只需使用Edit代替InsertAppend;其余的保持不变。

ClientDataSet1.Edit;
ClientDataSet1.FieldByName('RES_NAME').AsString := Edit1.Text;
ClientDataSet1.Post;

当您准备从TClientDataSet中所做的更改实际更新服务器数据时,请将其命名为ApplyUpdates

ClientDataSet1.ApplyUpdates(0);

答案 1 :(得分:0)

您可以使用ClientDataSet1.ParamByName('RN').AsString := Edit1.Text;