Delphi Datasnap-插入带参数的记录

Delphi Datasnap-插入带参数的记录,delphi,datasnap,Delphi,Datasnap,在DatasnapServer上,我有: TSQLConnection已连接到我的数据库。 SQLDataset1(CommandType=ctQuery),它从我的表中获取数据(我们称之为“RESORTS”)。 DataSetProvider1已连接到我的SQLDataset1。 DataSetProvider1设置为AllowCommandText 这工作正常。服务器启动时没有问题。数据已获取 在客户端,我有: 连接正常的SQLConnection1。驱动程序是Datasnap。 DSPro

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

这工作正常。服务器启动时没有问题。数据已获取

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

在客户端窗体上,我有一个Edit1和一个按钮1。 我尝试使用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:未找到字段“RN”

所以,我想知道发生了什么?为什么我不能插入带有参数的数据? 如果我将参数替换为: ClientDataSet1.CommandText:=“插入RESORTS(RES_NAME)值(“TRY”)”; 我得到:远程错误:SQLDataSet1:查询未返回游标。 但是,数据确实会被插入

我做错了什么?

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

您的整个方法都是错误的。:-)您没有使用参数、SQL或
CommandText
。报告明确指出:

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
中所做的更改实际更新服务器数据时,请调用它的
ApplyUpdate

ClientDataSet1.ApplyUpdates(0);

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

ClientDataSet1.Params.ParamByName('RN')。AsString:=Edit1.Text;出现“游标未从查询返回”错误,数据插入两次!它对我来说很好,但我不知道在您显示的代码完成后,您对open ClientDataSet1做了什么。通常设置SQL,分配参数值,执行查询,然后立即关闭查询;执行INSERT语句后,没有可访问的内容。(如果您的代码引用TSQLDataSet,那么它不是'Params.ParamByName',正如我的代码所说,它只是
ParamByName
。)等等,我看到了问题所在。我刚刚复制了你的代码。将
Execute
更改为
ExecSQL
。我将编辑我的答案。看来你必须先写“params”。否则:[dcc32 Error]Unit2.pas(131):E2003未声明的标识符:“ParamByName”。我使用ClientDataSet1获取网格中的数据,因此必须先关闭它才能使用它执行查询。即使我删除了数据集的打开和关闭,我仍然会收到相同的错误。如果您必须编写
Params.ParamByName
,则您没有像您所说的那样使用TSQLDataSet。无论如何,错误是因为在执行插入操作后无法从查询中检索数据,因为没有数据。您需要进行另一次选择以获取要在网格中显示的数据。否。TClientDataSet完全不使用SQL,除了可以在CommandText中提供的选择之外。请参阅TClientDataSet.CommandText的帮助文件,该文件告诉您它只接受查询(SELECT语句)或表或存储过程的名称。当代码尝试使用TClientDataSet时,不能使用INSERT语句。将valie分配给autoinc字段,并让服务器处理更新。如果需要,您可以使用TClientDataSet.OnReconcienceError事件进行排序。按“ClientDataSet”的“CommandText”上的F1键并读取,它正试图检索数据,因此“游标未返回…”。不,您不能。TClientDataSet不允许在其CommandText中插入,因此没有可使用ParamByName分配的参数。我的回答是正确的。