弱弱地问:OleVariant变量中保存着近4K的二进制数据,如何保存到SQL Server的数据库里?

futurefu 2002-04-01 01:34:22
我曾经用TBlobField的AsString和AsVariant方法,但存完之后就都不是原来的东东了.我是往SQL Server的binary字段里存,字段大小定义的和OleVariant变量中保存的二进制数据一样大.
我现在是头大、眼花,还请高人指点一、二!
...全文
64 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
futurefu 2002-04-02
  • 打赏
  • 举报
回复
现在又发现一个怪异的现象,使用TMemoryStream对象将数据保存到SQL SERVER中,然后又用TMemoryStream对象取出,发现前后两次的TMemoryStream对象的数据有细微差异.
futurefu 2002-04-02
  • 打赏
  • 举报
回复
//msField用来读出SQL SERVER中的二进制字段
TMemoryStream *msField = new TMemoryStream();
try
{
//SQL SERVER中当前记录的二进制字段保存到TMemoryStream对象中
TBlobField(Table1->FieldByName("BinaryField")).SaveToStream(msField) ;
msField->Position = 0 ;
//检查TMemoryStream对象中保存的数据的大小。
//ShowMessage(IntToStr(msField->Size)) ;
/*现在的问题是无法将TMemoryStream对象中的数据转移到OleVariant变量中*/
}
__finally
{
delete msField;
}
kingcaiyao 2002-04-02
  • 打赏
  • 举报
回复
请问你取出时的代码是?贴出来好吗?
kingcaiyao 2002-04-02
  • 打赏
  • 举报
回复
请问你取出时的代码是?贴出来好吗?
wt_sanlian 2002-04-02
  • 打赏
  • 举报
回复
你可以绕过TBlobField
直接形成SQL语句,我以前曾将图象文件全部转换为字符串,然后直接形成SQL 语句

将二进制格式转换为16 进制的字符串
直接放在SQL语句中,形成的语句如下

Insert Table01 (BH, Photo) values ('100001',0xA2FCD2D4....)

然后将其放入Query1 -> SQL 中
再来一个 Query1 -> ExecSQL();

kingcaiyao 2002-04-02
  • 打赏
  • 举报
回复
TBlobField(Table1->FieldByName("BinaryField")).SaveToStream(msField) ;
请改成:因为函数FieldByName取出的是一指针
TBlobField *BlobFiled=(TBlobField*)(Table1->Fields->Fields["BinaryField"];

关于第二点:
OleVariant V;
V=MyQuery->FieldByName("BinaryField")->AsVariant;



futurefu 2002-04-01
  • 打赏
  • 举报
回复
多谢Kingcaiyao(AKing)!
我曾经使用如下步骤保存:
1、使用TMemoryStream的Write方法将OleVariant值读到TMemoryStream对象中;
2、用TBlobField的LoadFromStream将其保存到SQL Server中;

然后再用如下步骤取出;
1、用TBlobField的SaveToStream将其取出到TMemoryStream对象中;
此时,我检查了取出数据的大小,确为原大小,只是在这里我无法将TMemoryStream对象中的数据再转化为OleVariant变量,所以该方法最后只好做罢,也许仁兄不吝赐教,可以在此点拨小弟一二!
kingcaiyao 2002-04-01
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{

TMemoryStream *MStream=new TMemoryStream();
HGLOBAL hMem=::GlobalAlloc(GMEM_MOVEABLE,4096);
if(!hMem)
{
Application->MessageBox("can't new movable memory block!","Error",MB_OK+MB_ICONERROR);
return;
}
void *pMem=GlobalLock(hMem);
memcpy(pMem,your olevariant's content,4096);
MStream->Position=0;
MStream->SetSize(4096);
MStream->Write(pMem,4096);
MyQuery->Close();
MyQuery->SQL->Clear();
MyQuery->SQL->Add("select * from table");
MyQuery->Open();
TBlobField *MyField=(TBlobField*)MyQuery->FieldByName("your blob field");
MyField->LoadFromStream(MStream);
GlobalUnlock(hMem);
delete MStream;
}



kingcaiyao 2002-04-01
  • 打赏
  • 举报
回复
用TMemoryStream看看。

1,178

社区成员

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

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