DBGrid的浮点转换误差???delphi的BUG??? (100分)

  • 主题发起人 主题发起人 sermon
  • 开始时间 开始时间
S

sermon

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TFormMain.AddInformation(info:string); //添加信息记录
var
i:integer;
id,sSQL:string;
begin
i:=TreeView1.Tag;
id:=copy('00000'+ inttostr(i),length(inttostr(i))+2,4);
ADOQueryInfo.DisableControls;
try
sSQL :='Insert Into A_Information(ID,Info,RecordTime) Values ';
sSQL := sSQL + '('''+ id + ''',''' + info + ''', getDate() )';
ADOQueryInfo.SQL.Clear;
ADOQueryInfo.SQL.Add (sSQL);
ADOQueryInfo.ExecSQL;
ADOQueryInfo.Close;
except
end;
ADOQueryInfo.EnableControls;
end

我使用了一个DBGrid,一个ADOQuery,并在数据表中将ID和RecordTime设为主键。
可是每次在GBGrid里生成的数据中的RecordTime的值
总是比sql表里的值要小些(一般为00:00:01的差距)
注:这个微小的差距对我的数据处理影响很大
哪位大虾帮我解决一下,盼给出详细的分析过程,谢谢
 
[red][/red]书上好象没有
 
大富翁的高手呢?
都不肯出手帮帮?
 
没看明白,你DBGrid里的RecordTime怎么生成的,为什么不把RecordTime存在变量里,
然后付给DBGrid和ADOQuery。
 
你的DBGRID中的数据是不是取自adoquery,就是说将DBGRID的数据源设为ADOQUERY?如果是的
话你就在将数据插入后在刷新一下DBGRID后看一看,
 
一个是delphi 中的值,一个是 sql 数据库中的值,
从 delphi 提交到在 sql中执行需要时间,可能就是这个时间差。

你的 getDate() 应该是 SQL服务端的值!
 
你是什么数据库,微软的SQL-SERVER吗?
问题出现在你用DBGRID生成的时间是CLIENT的机器系统时间和DATABASE SERVER
的时间不是一个,而这个时间获得后还要通过SQL语句提交给DATABASE SERVER又需要一定
时间,所以你的代码:
sSQL :='Insert Into A_Information(ID,Info,RecordTime) Values ';
sSQL := sSQL + '('''+ id + ''',''' + info + ''', getDate() )';
获取的时间准确。请你将你DBGRID的具体用途说一下,看有没有替代办法
 
回以上朋友:
是的
我用的数据库是SQL-SERVER,DBGRID中的数据就是取自adoquery
RecordTime是用sql的getDate() 函数生成的一个datetime类型的值

因为数据表中将ID和RecordTime设为主键,我现在要查一个数据并将其修改
使用Update语句,就必须设置条件
sSQL1:='Update A_Information';
sSQL2:=' SET Info='''+info+''',RecordTime=getDate() ';
sSQL3:='where ID='''+sID+''' AND RecordTime='''+sRecordTime+'''';
sSQL := sSQL1 + sSQL2+sSQL3;
这样,由于GDGrid里的时间和sql里的时间有微小的差异,导致操作无法完成
其中sID和 sRecordTime ,我是这样获取的
sID := FormMain.DBGrid1.DataSource.DataSet.FieldByName('ID').AsString;
sRecordTime := FormMain.DBGrid1.DataSource.DataSet.FieldByName('RecordTime').AsString;

哪位能看看,我的程序的漏洞在哪里?还是delphi自身控件的延时问题?
 
我觉得你insert里的时间应该取DBGrid里的时间,这样就是一样的。
 
大富翁里真的没有人能搞定了么??
???

我的boss说是DBGrid的浮点转化时出了问题,但我觉得delphi应该不会有这种漏洞才对!!
 
是不是DELPHI中问题, 你只要用select语句
'select * from A_Information where ID='''+sID+'''
AND RecordTime='''+sRecordTime+'''';
就可以检查出来, 看看是否AsString方法返回了错误
的结果.
其实,这不是DELPHI的问题, 问题出在你使用了把
参数包括在字符串中的方法, 而不是将recordtime
作为ADO的参数传递, 这样, 该语句传递到SQL端时,系统
将其变换回浮点数后出现了精度损失. 所以, 一般推荐
使用ado的command对象的参数对象来保存参数
 
to fatbug:
只需使用“ado的command对象的参数对象来保存参数”
那么:
相应的语句要不要作更改呢??
关键是RecordTime是不是还可以由getDate()来生成呢?

我很苯的了,请高人指点
 
我觉得这是SQL Server的问题.我记得在数据类型中有提到过多1的问题.
 
应该
不是delphi的问题
 
关键是怎么解决阿
FW们
 
应该是数据类型的问题
 
delphi在做浮点转换时是有问题。

好象是用value和asfloat时,有时值不一样,我以前的程序就遇到过
 
将这段程序写在存储过程里,并且是一个事务内
 
后退
顶部