奇怪的现象:从Access97数据库导入到SQL Server 7.0数据库image类型字段。(100分)

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

skyrabbit

Unregistered / Unconfirmed
GUEST, unregistred user!
单机版的数据从Access97数据库导入到SQL Server 7.0中,用TBatchMove的话,
好象不支持SQLServer的image类型字段,因为Access其中有JPEG图片数据,
所以TBatchMove不可用,只好自己写代码。

奇怪的是:用下边的代码编译后运行的话,出错。单步运行的话,却又正常的很,为什么?
有请各位富翁指点其中原因。

代码有点长,但是很简单,请费神看完。期待各位的指教!

Query1->Active = false;
Query1->DatabaseName = "BackUpDB"; //Access数据库
Query1->SQL->Clear();
Query1->SQL->Add("Select * from MyTableName");
Query1->Active = true;
Query1->First();

Table1->DatabaseName = "MainDatabase"; //SQL Server数据库
Table1->TableName = "MyTableName";
Table1->Close();
Table1->Open();
try{
while (!Query1->Eof)
{
Table1->Append();
Table1->FieldByName("gbnum")->Value = Query1->FieldByName("gbnum")->Value;
Table1->FieldByName("jlsj")->Value = Query1->FieldByName("jlsj")->Value;
Table1->FieldByName("ndtz")->Value = Query1->FieldByName("ndtz")->Value;
Table1->FieldByName("sysgn")->Value = Query1->FieldByName("sysgn")->Value;
//以上字段包括数字、文本等,都能正常赋值
{
TMemoryStream * st = new TMemoryStream();
try
{
dynamic_cast<TBlobField *>(Query1->FieldByName("syszp"))->SaveToStream(st);
//dynamic_cast<TBlobField *>(Query1->FieldByName("syszp"))->SaveToFile("0123.123");
/*走到这里就出问题了,用SaveToFile方法也一样出错;但是单独
做显示图片字段的小模块测试时一样的代码没出问题*/
/*编译通过后运行到这一条语句就出发异常了,但是单步运行时
却又正常过去了,为什么??*/
st->Position = 0; //或者st->Seek(0,soFromBeginning);
dynamic_cast<TBlobField *>(Table1->FieldByName("syszp"))->LoadFromStream(st);
//dynamic_cast<TBlobField *>(Table1->FieldByName("yxzp"))->LoadFromFile("0123.123");
}
catch(...)
{
dynamic_cast<TBlobField *>(Table1->FieldByName("syszp"))->Clear();
//所以jpg图片数据始终到不进来
}
delete st;
}
Table1->Post();
Query1->Next();
};
}
catch(...)
{
;
}
Table1->Close();
Query1->Close();



//这是显示数据库中图片字段的代码,运行正常
if (( dynamic_cast<TBlobField *>(Querycard->FieldByName("syszp"))->BlobSize)>100)
{
TJPEGImage *MyJPEG=new TJPEGImage();
TMemoryStream * st = new TMemoryStream();
dynamic_cast<TBlobField *>(Querycard->FieldByName("syszp"))->SaveToStream(st);
st->Seek(0,soFromBeginning);
MyJPEG->LoadFromStream(st);
photo->Picture->Assign(MyJPEG);
delete MyJPEG;
delete st;
}
else
photo->Picture=Assign(NULL);
 
试试用powerbuild的数据库复制功能,应该比BatchMove强很多,
可以进行类型转换
 
建议用Delphi5试一试
 
如果只想导数据,用SQL SERVER的导入功能就可以
如果想用程序实现,先试试 ADO ,再用DELPHI5试一下
我用DELPHI5已经试成功了(ACCESS2000,SQL SERVER7.0)
 
是想用程序实现,
昨天晚上和今天上午继续测试(BCB4.0+SQL Server7.0+ACCESS97),发现:
1.在PWin98环境下脱离IDE运行正常
2.在NT4.0+SP5下单步运行正常,脱离IDE运行就出现以上情况的错误.
去掉try/catch后,运行错误提示是:External exception EEFFACE

难道这与操作系统有关? 为什么单步和编译后运行不一样呢?
 
终于连接成功,终于打开了问题......

1.下午继续测试,发现如果BackUpDB从SQL Server数据库中取数据,程序就没有问题,
如果BackUpDB从ACCESS97数据库连接,问题就来了。
2.TQuery换成TTable控件后问题依旧。

Please Help Me!!!
 
我在复制的时候匆忙中给漏了,正确的应该是:(感谢程云指出)
dynamic_castQuery1->FieldByName("syszp"))->SaveToStream(st);
dynamic_cast(Table1->FieldByName("syszp"))->LoadFromStream(st);
 
越急越乱,代码又贴错了.
请原谅!
正确的代码应该是:
TMemoryStream * st = new TMemoryStream();
dynamic_cast<TBlobField *>(Query1->FieldByName("syszp"))->SaveToStream(st);
st->Position = 0;
dynamic_cast<TBlobField *>(Table1->FieldByName("syszp"))->LoadFromStream(st);
delete st;
 
错了错了,又错了!
是温柔一刀指出来的.向温柔一刀和程云致歉!

现在已经神智不清,只有下网了......
 
考虑一下用xushucheng说的Ado.BCB没用过
wrench说以前他用D4+Sql server 的时候也出现过这种情况
 
我前几天也遇过类似的问题:单步运行一切正常,但一起运行就出错,原因没找出来,
估计和时序有关,我认为是 D5 的 bug。
 
to skyrabbit:

不要着急,你后来贴的代码没错,但是由于有小于号,被浏览器吃掉了而已。
至于可能的问题,我还没有看出来,你的程序确保query/table正确的创建/释放么?
可以检查一下是否有指针/对象的创建/使用问题。
 
各位:
我想这是BDE中的控件本身引发的与NT4.0之间的冲突,所以最终采用了KADao控件作为
Access97数据源来实现图象数据的转移,采用同样的代码,结果就顺利通过了.
因为有事很久上不了网,今天就把这个问题给结了吧.

希望有机会还能和大家讨论 这个问题出现的 根本原因和处理方法.

谢谢!

 
分不多,大家分了吧.

有事不明白还要请教大家.
 

KADao控件的地址:It's Free!
www.delphi.pari.bg
 
后退
顶部