Delphi Datasnap-插入带参数的记录
在DatasnapServer上,我有: TSQLConnection已连接到我的数据库。 SQLDataset1(CommandType=ctQuery),它从我的表中获取数据(我们称之为“RESORTS”)。 DataSetProvider1已连接到我的SQLDataset1。 DataSetProvider1设置为AllowCommandText 这工作正常。服务器启动时没有问题。数据已获取 在客户端,我有: 连接正常的SQLConnection1。驱动程序是Datasnap。 DSProviderConnection1链接到我的SQLConnection1。 两者都没有问题。 然后是连接到ClientDataSet1的DataSource1。 ClientDataSet1已连接到我的DataSetProvider1。 将其设置为活动将从服务器检索数据。 全部显示在网格中的右侧 在客户端窗体上,我有一个Edit1和一个按钮1。 我尝试使用ClientDataset1运行一个查询Delphi Datasnap-插入带参数的记录,delphi,datasnap,Delphi,Datasnap,在DatasnapServer上,我有: TSQLConnection已连接到我的数据库。 SQLDataset1(CommandType=ctQuery),它从我的表中获取数据(我们称之为“RESORTS”)。 DataSetProvider1已连接到我的SQLDataset1。 DataSetProvider1设置为AllowCommandText 这工作正常。服务器启动时没有问题。数据已获取 在客户端,我有: 连接正常的SQLConnection1。驱动程序是Datasnap。 DSPro
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语句(查询)李>
- 表或存储过程的名称
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分配的参数。我的回答是正确的。