0

我的数据模块上有一个 Tadocommand,它连接到 MSSQL 存储过程。存储过程用于更新表。在我的代码中,我在我的一个 Tclientdataset 的 beforeupdaterecord 方法中调用了 tado 命令。

首先,我使用 Tclientdataset 的 deltads.fieldbyname().newvalue 为 tadocommand 参数提供值,然后调用执行过程。它适用于第一次更新,但如果我尝试进行下一次更新,它会生成“将 varchar 更改为 datetime 时出错”。

如果我在 beforeupdaterecord 方法中动态创建 tadocommand,即

sp1_editcontract:=Tadocommand.Create(nil);
sp1_editcontract.CommandType:=cmdStoredProc;
sp1_editcontract.Connection:=DMDBconn.DBConn;
sp1_editcontract.CommandText:='EditContract';
sp1_editcontract.Parameters.Refresh; 
//assign parameter values
sp1_editcontract.execute;
sp1_editcontract.free;

它没有任何错误。我认为在数据模块上使用静态 Tado 命令时参数值存在一些问题。

为什么在使用静态创建的 tadocommand 而不是动态创建的 tadocommand 时多次更新会产生错误?

4

2 回答 2

0

我将假设您指的是TDatasetProvider.BeforeUpdateRecord而不是TClientDataSet.BeforeUpdateRecord.

从您提供的信息中很难说(您没有指出存储过程的数据类型或参数的顺序)。错误消息来自 SQL Server 引擎。我会确保分配给参数的值始终以正确的顺序设置。还要尝试确定导致错误的参数。如果您可以在客户端代码中可靠地重现它,则可以尝试在 SSMS 中调用存储过程,传递导致客户端应用程序错误的相同值。

一旦确定了参数,您就可以检查其数据类型在 ADOCommand、DatasetProvider 和 ClientDataset 之间是否一致。如果它沿途更改类型,则可能是导致错误的原因。

最后一个建议,确保TDatasetProvider.Applied := True在退出BeforeUpdateRecord处理程序之前进行设置。这可以防止数据集提供程序在您已应用更新后尝试使用动态 sql 应用更新。如果客户端数据集中的数据由 TADOQuery 填充,它可能会尝试直接更新表。

于 2012-07-06T18:58:04.420 回答
0

我有一个类似的问题。为了在添加新参数之前清除 ADOCommand 的所有现有参数,请使用以下代码:

while Command.Parameters.Count>0 do
  Command.Parameters.Delete(0);

Parameters.Clear应该有效,但没有,所以我决定一一删除参数。这对我来说是固定的。

于 2013-09-18T11:01:31.663 回答