2

我有一个 Delphi XE 应用程序,它使用后面的TClientDataSetaTDataSetProvider和加号来访问 Oracle XE 数据库。TADOQuery我要写入的表有一个NUMBER(19)字段。

我正在向其中写入一个值,如下所示:

myDataModule.myClientDataSet.FieldByName('ID').AsLargeInt := ID;

假设我有一个1234567890123456789四舍五入的 ID 1234567890123460000

我怎样才能避免这种情况?

4

3 回答 3

3

确保TClientDataSet明确创建您的字段,ftLargeint否则您可能会遇到此类舍入问题。

忘记使用 ADO 访问 Oracle。请注意,由 ADO 连接的所有 OleDB 提供程序在处理 BLOB 时都存在错误:Microsoft 的版本只是不处理它们,Oracle 的版本将随机返回 1/4 行的 null ...如果您的网站出现类似问题,我不会感到惊讶案例,关于数值字段。

您可以查看访问 Oracle 的其他方法,例如 DBExpresss 驱动程序甚至 BDE。一些第三方组件也可用。

我们对 Oracle 的免费直接访问类本机处理此类数字字段,并将直接处理 Int64 值,无需TDataSet转换(这也可能是问题的原因)。例如,我认为它是唯一一个实现最新 11g 特性的 Delphi 单元,名为“用于 OCI 绑定和定义调用的 64 位整数主机数据类型”。它不需要客户端驱动程序(也不需要 BDE、Provider 或本地配置):您只需使用 Delphi exe复制Oracle Instance Client dll即可直接连接到 Oracle。结果速度惊人

于 2012-08-18T05:47:33.140 回答
1

您是否已use debug .dcus在 Delphi 项目选项中设置并逐步执行从初始变量分配到将数据传递给 Oracle 传输驱动程序的所有代码?您是否验证了该值何时四舍五入为 15 位?

这是其他论坛中的一些帖子,非 Delphi 用户也有同样的问题,这是由使用该to_char()功能引起的。我想知道number(19)(或BigInt)值是否在设置值和发布到数据库之间的某个位置被转换为字符串。

于 2012-08-18T00:31:43.693 回答
0

我决定扔掉TClientDataSetandTDataSetProviderTADOQuery直接使用 来插入值。

即我现在有这样的东西:

myDataModule.myQuery.SQL.Clear;
myDataModule.myQuery.SQL.Add('INSERT INTO mytable (ID) VALUES(:ID)');
myDataModule.myQuery.Prepared := True;
myDataModule.myQuery.Parameters.ParamByName('ID').Value := 1234567890123456789;
myDataModule.myQuery.ExecSQL;

不是一个完美的解决方案,但它有效。

于 2012-08-27T06:37:29.497 回答