c++ builder 中如何实现二进制文件入SQL数据库(100分)

  • 主题发起人 主题发起人 wrnxd168
  • 开始时间 开始时间
请说的清楚一点,是把文件已二进制的形势保存的数据库马?
TFileStream* ComposedFile = new TFileStream(filename,fmOpenRead);
iFileLength = ComposedFile->Size;
//文件的大小
//RzEdit5->Text = IntToStr(iFileLength);
//Summation = Summation + iFileLength;
//相同文件名的总大小
// Size = Summation;
Main_DataModule->ADOQuery1->Last();
Main_DataModule->ADOQuery1->Append();
Main_DataModule->ADOQuery1->Edit();
Main_DataModule->ADOQuery1->FieldByName("MAP_ID")->AsString =IntToStr( Main_DataModule->ADOQuery1->RecordCount+1);
Main_DataModule->ADOQuery1->FieldByName("MAP_FILENAME")->AsString = ExtractFileName(FileText);
Main_DataModule->ADOQuery1->FieldByName("MAP_EXTENDNAME")->AsString = strExtendedName;
Main_DataModule->ADOQuery1->FieldByName("MAP_SIZE")->AsFloat = iFileLength;
((TBlobField*)(Main_DataModule->ADOQuery1->FieldByName("MAP_CONTENT")))->LoadFromStream(ComposedFile);
Main_DataModule->ADOQuery1->Post();

如果是的话你可以看一下这段代码
 
还有就是字段设成 image 型的
 
TMemoryStream * ps=new TMemoryStream();
AnsiString sql;
ADOTable1->Open();
ADOTable1->First();
ADOTable1->Edit();
ADOTable1->FieldValues["c_id"]=cid->Text;
((TBlobField*)(ADOTable1->FieldByName("b_content")))->LoadFromStream(ps);
ADOTable1->Post();
ps->Free();
报错: Invalid class typecast,什么意思?
 
少贴一句
ps->LoadFromFile(Edit1->Text);
 
TMemoryStream();不能这么写的
一定要写成 TFileStream(filename,fmOpenRead);

filename 为你读入的文件
 
to dixiaoliang:
我改成TFileStream 也是一样的报错呀
 
//TBlobStream * bs;
TFileStream *cfile=new TFileStream(Edit1->Text,fmOpenRead);
//TMemoryStream * ps=new TMemoryStream();
AnsiString sql;
// ps->LoadFromFile(Edit1->Text);
ADOTable1->Open();
ADOTable1->First();
ADOTable1->Edit();
ADOTable1->FieldValues["c_id"]=cid->Text;
((TBlobField*)(ADOTable1->FieldByName("b_content")))->LoadFromStream(cfile);
ADOTable1->Post();
ps->Free();

报同样的错误
 
TFileStream* ComposedFile = new TFileStream(filename,fmOpenRead);
你按这个格式 是以使会不会出错 我这里没有出错阿 C++Builder6
composedfile 不需要 Free;
我的最后一句为 delete Composedfile;
 
edit->Text;你这样读进去了只是一个字符串阿,最好用openDialog
像这样 首先 filename = openDialong->filename;
在把 filename 写入
TFileStream* ComposedFile = new TFileStream(filename,fmOpenRead);
这样应该不会出错 我就是这么做的
 
TFileStream* ComposeFile=new TFileStream("c://report.txt",fmOpenRead);
AnsiString sql;
ADOTable1->Open();
ADOTable1->First();
ADOTable1->Edit();
ADOTable1->FieldValues["c_id"]=cid->Text;
((TBlobField*)(ADOTable1->FieldByName("b_content")))->LoadFromStream(ComposeFile);
ADOTable1->Post();
delete ComposeFile;
同样的报错,我都晕了,到底怎么回事呀
我用的是ADOTABLE,SQLServer2000数据库
 
等一下 马上哈
 
//将文件流的数据保存到数据库
filename = m_strBrowseFN;
//由 OpenDialong代开的文件
tablename = "MapComponent_Browse";

Main_DataModule->ADOQuery1->Close();
Main_DataModule->ADOQuery1->SQL->Clear();
AnsiString sql = "select * from " + tablename;
Main_DataModule->ADOQuery1->SQL->Add(sql);
Main_DataModule->ADOQuery1->Open();

TFileStream* ComposedFile = new TFileStream(filename,fmOpenRead);
iFileLength = ComposedFile->Size;
//文件的大小
//RzEdit5->Text = IntToStr(iFileLength);
//Summation = Summation + iFileLength;
//相同文件名的总大小
// Size = Summation;
Main_DataModule->ADOQuery1->Last();
Main_DataModule->ADOQuery1->Append();
Main_DataModule->ADOQuery1->Edit();
Main_DataModule->ADOQuery1->FieldByName("MAP_ID")->AsString =IntToStr( Main_DataModule->ADOQuery1->RecordCount+1);
Main_DataModule->ADOQuery1->FieldByName("MAP_FILENAME")->AsString = ExtractFileName(FileText);
Main_DataModule->ADOQuery1->FieldByName("MAP_EXTENDNAME")->AsString = strExtendedName;
Main_DataModule->ADOQuery1->FieldByName("MAP_SIZE")->AsFloat = iFileLength;
((TBlobField*)(Main_DataModule->ADOQuery1->FieldByName("MAP_CONTENT")))->LoadFromStream(ComposedFile);
Main_DataModule->ADOQuery1->Post();
delete ComposedFile;
如果实在不行 可以改成ADOQuery 我没有用过ADOTable 不好意思
以上代码绝对正确
 
to dxiaoliang:
MAP_CONTENT 字段类型是 binary吗?
 
恩 设计表的时候设计成 image 类型
 
我试了一下,image类型的可以,binary的就是不行,why?
 
这个问题都没有注意 因为一开始我就设成了image类型 我看一下我的程序能不能阿
 
我也试了 binary就是不可以 只能用image来存的 谢谢你的提醒阿
好像 binary 输入的直接是二进制把不需要转换 我是这么想的
 
接受答案了.
 
后退
顶部