在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返回光标。 但是,数据确实已插入。
我在这里做错了什么?
答案 0 :(得分:2)
(根据海报在评论中提供的新信息重写。)
你的整个方法都是错误的。 :-)您不使用参数,SQL或CommandText
。 TClientDataSet.CommandText documentation清楚地说:
CommandText指定客户端数据集希望从其(内部或外部)提供程序接收的数据。它是:
- 要执行的数据库服务器的SQL语句(查询)。
- 表或存储过程的名称
SQL语句(查询)表示只有SELECT
是可接受的SQL。 INSERT
不是查询,因此无法在CommandText
中用于插入数据。
要在TClientDataSet
中插入数据,只需Insert
或Append
,然后使用FieldByName
设置值,然后调用Post
方法:
ClientDataSet1.Insert;
ClientDataSet1.FieldByName('RES_NAME').AsString := Edit1.Text;
ClientDataSet1.Post;
要进行修改,只需使用Edit
代替Insert
或Append
;其余的保持不变。
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('RES_NAME').AsString := Edit1.Text;
ClientDataSet1.Post;
当您准备从TClientDataSet
中所做的更改实际更新服务器数据时,请将其命名为ApplyUpdates
:
ClientDataSet1.ApplyUpdates(0);
答案 1 :(得分:0)
您可以使用ClientDataSet1.ParamByName('RN').AsString := Edit1.Text;