首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

将Image中的图片存到sqlserver中,该如何解决

2012-05-09 
将Image中的图片存到sqlserver中在Image控件上有一个.bmp的图片,怎么在Button之后存入数据库(数据库字段 u

将Image中的图片存到sqlserver中
在Image控件上有一个.bmp的图片,怎么在Button之后存入数据库(数据库字段 user_image image);

[解决办法]
http://blog.csdn.net/qq752923276/article/details/6407005
[解决办法]
在利用数据库进行MIS系统的开发过程中,经常需要把BLOB数据统一存放在数据库中以便共享处理。本文介绍在多层体系结构下,C++Builder中BLOB的读写方法(也适用于两层的C/S结构)。 

程序处理示意图如图1所示: 

BLOB读取 

应用服务器用TQuery控件连接到数据库,并显示输出接口(即直接拖拉TDataSetProvider控件,把新控件的DataSet指向要引出的TQuery)。注意:不能隐式输出Provider接口,即在要输出接口的控件上单击鼠标右键,选择“Export Query1 From Data Module”。 

应用服务器与客户端TClientDataSet控件通过Midas中间件连接。直接通过Select语句读出即可,语句序列写法如下: 

ClientDataSet1->Close(); 

ClientDataSet1->SQL->Clear(); 

ClientDataSet1->SQL->Add(合法的Select语句); 

ClientDataSet1->Open(); 

BLOB写入 

客户端通过TClientDataSet控件的ApplyUpdates方法提交已修改的BLOB数据到应用服务器。(根据BCB开发手册介绍,ApplyUpdates方法可以更新BLOB数据到数据库,但实际中常出现更新失败的情况)。 

应用服务器截获从客户端传来的BLOB数据,利用两层结构的提交方式提交。本例中,假设系统中所有BLOB数据存放在同一表BlobTbl中,表结构为:BlobId INT、BlobText BLOB。BLOBId为该表关键字,BLOB相关数据通过该关键字同BLOB数据关联。所有BLOB数据均通过该数据集Query1进行处理。客户端数据集有且只有一条更新内容,否则,只有第一条更新内容有效。如果存放多个表或一次更新多个记录,可通过其他一些技巧实现。 

在引出接口TdataSetProvider的BeforeUpdateRecord事件中,编写如下代码: 

void __fastcall SrvCom::Query1BeforeUpdateRecord(TObject *Sender,TDataSet *SourceDS, TClientDataSet *DeltaDS, TUpdateKind UpdateKind, bool &Applied) 

if (UpdateKind != ukDelete) 



AnsiString SessionName; 

TSession *SessionForTran; 

//生成临时数据集供提交使用 

TQuery* tmpQry=new TQuery(NULL); 

try 



//从与数据库连接的会话池中取可用的会话 

SessionName=SessionPools->GetSession 

Name(……); 

if(!SessionName.IsEmpty()) 



//设置临时数据集的会话 

SessionForTran=Sessions-> 

FindSession(SessionName); 

tmpQry->DatabaseName=SessionForTran->Databases[0]->DatabaseName; 

tmpQry->SessionName=SessionName; 

tmpQry->RequestLive=true; 

//设置修改数据集 

tmpQry->SQL->Add(“Select * From BlobTbl Where BlobId="+SourceDS->FieldByName(“BlobId")->AsString); 

tmpQry->Open(); 

//更新数据 

tmpQry->Edit(); 

((TBlobField*)tmpQry->FieldByName 

(“BlobText"))->Value=((TBlobField *)DeltaDS-> 

FieldByName(“BlobText"))->NewValue; 

//提交数据 

tmpQry->Post(); 

tmpQry->Close(); 

delete tmpQry; 



} catch(Exception &e) 



delete tmpQry; 

throw e; 



//忽略BCB的处理机制 

Applied=true; 



注意:BLOB数据提交必须在事务中进行,本例中未进行事务处理是因为把事务放到了客户端进行处理。不要使用SQL的DML语句(如INSERT、UPDATE),因为通常数据都有特殊专用字符,而这些字符都有可能出现在BLOB数据中,从而导致数据库处理错误。 

效率处理 

对BLOB读写不要使用TTable控件,否则会大大降低效率。 

在多层体系结构下,服务器端从数据库读取BLOB数据时,最好采用单独的会话(Sessions),避免多用户状态下,一个用户读取较大的BLOB数据时,其他用户等待响应的时间过长。 

最好把BLOB数据单独存放在一个表中,不要同相关联的其他类型数据存放在同一表中。一般数据库均会自动把BLOB数据存放到专门的数据空间。同时,最好在逻辑视图上也把它们分开,既好理解也好处理。 

BLOB同非BLOB数据在读写时也要分开处理。 

在多用户情况下,可在应用服务器设置BLOB缓冲池,再设计专门的读写函数供客户端调用处理。

[解决办法]
Image1->Picture->SaveToFile("temp.jpg");
[解决办法]

C/C++ code
SQL Server2000 我用的image 类型  //存储  TBlobField *blob_pic=(TBlobField *)UserMod->TInsert->FieldByName("IMAGE");      try      {          blob_pic->LoadFromFile(app_path+"//temp//temp.jpg");      }      catch(...)      {        ShowMessage("图像存盘失败!");      }       UserMod->TInsert->Post();      UserMod->TInsert->Refresh();    }   //读取  TBlobField *blob_pic=(TBlobField *)DBGrid4->DataSource->DataSet->FieldByName("IMAGE");      try      {          blob_pic->SaveToFile(app_path+"//temp//temp1.jpg");          Image9->Picture->LoadFromFile(app_path+"//temp//temp1.jpg");      }      catch(...)      {          ShowMessage("图像读取失败!");      }      delete blob_pic; 

热点排行