怪问题: '0.0' is not a valid timestamp

qsgs 2006-04-20 01:47:06
今天突然遇到了一个怪问题:
ClientDataSet1中定义了一个ftDateTime型字段"Time",用一个DBGrid连接ClientDataSet1,当执行
ClientDataSet1->Append() ;
...
ClientDataSet1->FieldByName("Time")->AsDateTime=Now();
...
ClientDataSet1->Post();

后,跳出异常提示: '0.0' is not a vaild timestamp
而且这个异常用try...catch捕捉不到!

如果不用DBGrid连接ClientDataSet1则无此异常!
将"Time"改成ftString型也没问题!

如何解决啊!

...全文
1362 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
soloxiao 2006-05-20
  • 打赏
  • 举报
回复
试一下:
ClientDataSet1->FieldByName("Time")->AsDateTime=Now().CurrentDateTime()

ClientDataSet1->FieldByName("Time")->AsDateTime=Now().Val
另外,时间字段为当前时间最好将Talbe中的设计预设值为getdate()(mssql)/Now()(ms access)
勉励前行 2006-05-20
  • 打赏
  • 举报
回复
1: ClientDataSet1->FieldByName("Time")->AsDateTime=Now();
...
2: ClientDataSet1->Post();

异常是在运行哪行时出现的.

如果在行 1 , 如果你的字段类型是 TSQLTimeStampField ,那么你不应该用 FieldByName("Time")->AsDateTime 方法, 而该用:
TSQLTimeStampField *SQLTimeStampField =
(TSQLTimeStampField *)(ClientDataSet1->FieldByName("Time"));
SQLTimeStampField->AsSQLTimeStamp = DateTimeToSQLTimeStamp(Now());

如果是在post的时候出现的吧,单步调试一下,看看是否其他代码的问题,如果真是在post的时候出了异常,可能是TimeStamp类型这个特殊的字段类型你不该写,或是所用的格式BCB不认识.

struct TSQLTimeStamp

{
short Year;
Word Month;
Word Day;
Word Hour;
Word Minute;
Word Second;
long Fractions;
} ;
勉励前行 2006-05-20
  • 打赏
  • 举报
回复
timestamp 类型一般只用於只读的,因为每次写记录DBS都会改写这个值。沒試過修改这个值.

FieldByName("Time")->AsDateTime=Now(); //

Time字段是什么类型的呢? 怎么可以任意改为ftString类型呢.

就算如 qsgmail(qsgmail) 所贴是BCB本身问题,但 Now 也不该是 0.0 啊 , 整个代码也没出现对该字段赋值 0.0 的, 不理解问题出在哪里.
daydayup234 2006-05-20
  • 打赏
  • 举报
回复
我碰到过类似问题
因为dbgrid的数据集打开是在
form的构造函数中
改到active事件中
好了

不知你的是不
stevenjscn 2006-05-04
  • 打赏
  • 举报
回复
到BCB网站上DOWNLOAD 补丁,1 2 3 4再试一下。
qsgs 2006-04-21
  • 打赏
  • 举报
回复
再说详细些:
出问题的代码是IdTCPServer的OnConnect里的一部分,这部分代码应该不是在主线程里执行的,ClientDataSet1是在主线程中定义的,问题会不会跟线程有关呢?ClientDataSet是不是线程安全的呢?
daydayup234 2006-04-21
  • 打赏
  • 举报
回复
跟ClientDataSet1有关把
qsgs 2006-04-21
  • 打赏
  • 举报
回复
如何在IdTCPServer的OnConnect里使用ClientDataSet或BDEClientDataSet才是线程安全的呢?
qsgs 2006-04-20
  • 打赏
  • 举报
回复
没有别人遇到过吗?我在CSDN里搜不到相关的帖子

还有一怪:同一程序里别的ClientDataSet也有ftDateTime类型的字段,也都连着DBGrid,可是都没问题
netsys2 2006-04-20
  • 打赏
  • 举报
回复
这样看来是CB的问题。。。
qsgs 2006-04-20
  • 打赏
  • 举报
回复
从网上搜来的老外的帖子,居然要修改SYSCONST.PAS和SYSUTILS.PAS然后重新编译,屏蔽掉这个异常,是不是有点过了.
--------------------------------------------------------------
...
I find a solution for this problem. I am not expert, is this a good
way or not I do not know.
But I searched many groups a good solution for this but I couldn't
find and, I solved the problem with my way :

I am using paradox tables. To delete in some date field's content I
was using this way (before learning Clear method) :

Table.FieldByName('datefieldsname').AsFloat := 0;

And this fields datas are now 00.00.0000 :)

This fields on DBGrid and DBEdit gave "0.0 is not a valid timestamp"
error.

I searched "is not a valid timestamp" in Delphi 6's sources. I found
it in
C:\Program Files\Borland\Delphi6\Source\Rtl\Sys\SYSCONTS.PAS
in it there was a line like this :
SInvalidTimeStamp = '''%d.%d'' is not a valid timestamp';

and I searched "SInvalidTimeStamp" in Delphi's sources. and found it
in :

C:\Program Files\Borland\Delphi6\Source\Rtl\Sys\SYSUTILS.PAS

I looked to Delphi 5's sources same files but this function there was
not in them (this is a new thing.)

And I disabled this function's with // or {} (it may be wrong but I
did.) After then, I recompiled this units with DCC32.exe and replaced
them with olders at Delphi's LIB directory.

If you want to do same I am writing the lines down (with search you
can find lines and do the lines same below) :

SYSCONST.PAS

// SInvalidTimeStamp = '''%d.%d'' is not a valid timestamp';

SYSUTILS.PAS

{
procedure ValidateTimeStamp(const TimeStamp: TTimeStamp);
begin
if (TimeStamp.Time < 0) or (TimeStamp.Date <= 0) then
ConvertErrorFmt(@SInvalidTimeStamp, [TimeStamp.Date,
TimeStamp.Time]);
end;

}

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
PUSH EBX
{$IFDEF PIC}
PUSH EAX
CALL GetGOT
MOV EBX,EAX
POP EAX
{$ELSE}
XOR EBX,EBX
{$ENDIF}
PUSH EAX
// CALL ValidateTimeStamp -> LOOK HERE
POP EAX
MOV ECX,[EAX].TTimeStamp.Time
MOV EAX,[EAX].TTimeStamp.Date
SUB EAX,DateDelta
IMUL [EBX].IMSecsPerDay
OR EDX,EDX
JNS @@1
SUB EAX,ECX
SBB EDX,0
JMP @@2
@@1: ADD EAX,ECX
ADC EDX,0
@@2: PUSH EDX
PUSH EAX
FILD QWORD PTR [ESP]
FDIV [EBX].FMSecsPerDay
ADD ESP,8
POP EBX
end;

function TimeStampToMSecs(const TimeStamp: TTimeStamp): Comp;
asm
PUSH EBX
{$IFDEF PIC}
PUSH EAX
CALL GetGOT
MOV EBX,EAX
POP EAX
{$ELSE}
XOR EBX,EBX
{$ENDIF}
PUSH EAX
// CALL ValidateTimeStamp -> LOOK HERE TOO
POP EAX
FILD [EAX].TTimeStamp.Date
FMUL [EBX].FMSecsPerDay
FIADD [EAX].TTimeStamp.Time
POP EBX
end;

You may try this way with your own risk.
I hope it is not very wrong.
qsgs 2006-04-20
  • 打赏
  • 举报
回复
如果只是为了解决问题,将字段改成ftString类型就可以.
我就是想搞清楚异常的原因!
qsgs 2006-04-20
  • 打赏
  • 举报
回复
没说明白,不是说这样转换不行,而是试过以后问题依旧.
主要是搞不明白为什么不用DBGrid就不会有问题!
netsys2 2006-04-20
  • 打赏
  • 举报
回复
这样转换不行呀,

---->这是CB的例子!

在help中输入关键字AsDateTime,然后选"example"!
qsgs 2006-04-20
  • 打赏
  • 举报
回复
需要转换。

Table1->FieldByName("TimeStamp")->AsDateTime = StrToDateTime(Now());

---------------------------------------------------------------------

这样转换不行呀,

真是怪,如果程序窗口最小化时也不跳出异常提示!
只要程序执行时,DBGrid不显示出来,或者DBGrid->DataSource=NULL都不跳出异常提示!
netsys2 2006-04-20
  • 打赏
  • 举报
回复

需要转换。

Table1->FieldByName("TimeStamp")->AsDateTime = StrToDateTime(Now());

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧