adoquery 写数据到mysql blob字段问题

iris_福将 2013-07-26 06:30:49
各位高人,遇到一个困扰我多日的问题,就是在BCB中我用ADOquery往MySQL数据库里的blob类型字段里写数据,用的方法是:
ADOQuery1->Parameters->ParamByName("waveform")->LoadFromFile("c:\\temp\\temp.seed",ftBlob);
其中文件temp.seed是标准的512字节长,但写入数据库后字段长度就增加了2个字节(0D 0A),每行数据都是这样。请问如何才能保证使用LoadFromFile方法读的数据就是文件的长度512呢?烦请高人帮帮我呀!

bcb6.0 服务器mysql
...全文
1192 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iris_福将 2013-07-29
  • 打赏
  • 举报
回复
在网上看到别人同样的问题,他是这样解决的: TBlobStream* TemplateStream =(TBlobStream*) ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("Waveform"),bmReadWrite); 不知为啥,反正这样就行了。我也按此办理了。 但是 ADOQuery1->FieldByName("id")->Value=no_temp; TemplateStream->Write((char *)seed_data_record, 512); //seed_data_record是标准的512字节流数据 …… ADOQuery1->Post(); …… blob类型的Waveform字段并没有被写进数据,是哪里出了错误?请高人指点!
yifuzhiming 2013-07-29
  • 打赏
  • 举报
回复
我之前把图片分割成几个文件的时候,内容也被添加了0D 0A,到现在也不知道是什么原因,估计跟你这个原因一样
iris_福将 2013-07-28
  • 打赏
  • 举报
回复
妖哥好。 就是多了两个回车换行符。不应该按文本文件处理,我不知道还应该怎么处理这个问题。 我在网上看到了其他的方法,似乎适合我的要求,就是TBlobSTream* TemplateStream;但按下面的做法通不过编译,总出问题。 …… #include <DBTables.hpp> #include <adodb.hpp> #include <dbtables.hpp> void __fastcall TForm1::write_DB(SEED_data_record *seed_data_record) { …… TBlobSTream* TemplateStream; ADOQuery1->Open(); ADOQuery1->Edit(); ADOQuery1->Append(); sprintf(no_temp,"%05d",ADOQuery1->RecordCount+1); ADOQuery1->FieldByName("id")->Value=no_temp; TemplateStream=new TBlobStream((TBlobField*)ADOQuery1->FieldByName("Waveform"),bmReadWrite); TemplateStream->Write((char *)seed_data_record, 512); …… ADOQuery1->Post(); } 为啥我已经包含了TBlobSTream所需的头段文件后,在编译时仍显示没有定义TBlobSTream呢? 【C++ Error】 E2451 Undefined symbol ‘TBlobSTream’ TBlobSTream究竟在哪个头段里呢?
ccrun.com 2013-07-28
  • 打赏
  • 举报
回复
你这个blog字段要存储的数据,0d 0a 后面是不是0x0的字符?这样的话,如果按文本来处理,就只有前面回车换行这两个字节。
iris_福将 2013-07-28
  • 打赏
  • 举报
回复
怎么没人帮助了呢?高人来帮我呀! 我是做数据流的,blob字段里的长度是固定的512字节。现在多了“0D 0A”,没有解决,着急呀。我今天按照妖哥的方法重新写了程序,还是没有解决。我想可能是ADOQuery1->Parameters->ParamByName("waveform")->LoadFromFile()方法不适合,请问高人还要有别的方法写blob的吗?
ccrun.com 2013-07-27
  • 打赏
  • 举报
回复
ADOQuery1->Edit();
TBlobField *bf = (TBlobField *)ADOQuery1->FieldByName("waveform");
TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite);
bs->Seek(0, soFromBeginning);
bs->LoadFromFile("c:\\temp\\temp.seed");
ADOQuery1->Post();
delete bs;
iris_福将 2013-07-27
  • 打赏
  • 举报
回复
版主妖哥好,先谢谢您的热情帮助。 我的按照妖哥的方法做了,我源代码是使用ADO的参数ParamByName赋值的,inser里字段原有23个之多,如果按照妖哥的FieldByName改动量大,我仍按照ADO的Parameters来做的,简化了一些字段,只用2个字段来说明。具体代码如下: void __fastcall TForm1::write_DB(SEED_data_record *seed_data_record) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Text="insert into waveform_con (id,Waveform) values(:t1,:t20)"; ADOQuery1->Parameters->ParamByName("t1")->Value =1; TBlobField *bf = (TBlobField *)ADOQuery1->Parameters->ParamByName("t20"); TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite); bs->Seek(0, soFromBeginning); bs->LoadFromFile("c:\\temp\\temp.seed"); ADOQuery1->ExecSQL(); delete bs; } 按照上述的代码运行到 TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite); 这句就出了问题,我不知道出错的原因在哪儿?还需要高人来帮我。 出错提示: --------------------------- seedp --------------------------- Access violation at address 6D614E04. Read of address 6D614E04. --------------------------- 确定 ---------------------------

1,178

社区成员

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

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