image字段或二进制字段的读写
来源:互联网 发布:时时彩平刷软件 编辑:程序博客网 时间:2024/05/19 12:13
使用MFC操作 SQL 的Image类型的字段.本文提供,读写函数,更多文章可以进入 http://www.panshsoft.com
首先要和数据库连接,并创建记录集,类似以下代码
首先要和数据库连接,并创建记录集,类似以下代码
- //使用ADO智能指针的方式访问数据库
- //初始化COM
- CoInitialize(NULL);
- _ConnectionPtr ADOConnection = NULL;
- _RecordsetPtr ADORecordset = NULL;
- ADOConnection.CreateInstance(__uuidof(Connection));//创建数据库连接对象
- //和数据库建立连接,g_ServerADODatabaseSource中是连接字符串
- ADOConnection->Open(g_ServerADODatabaseSource, "", "", -1);
- //创建记录集操作对象
- ADORecordset.CreateInstance(__uuidof(Recordset));
- //打开记录集,代码只供参考
- strSQL = "Select top 10 * from runDocInterface where bFinished=0";
- bstrSQL = strSQL;
- ADORecordset->Open(bstrSQL, _variant_t((IDispatch*)ADOConnection),adOpenDynamic,adLockPessimistic, adCmdText);
- //获取指定字段的数据,并保存为文件,这里是获取FaxFile字段数据
- lFileSize = Fun_ReadDBMS_IMAGE_Field(ADORecordset, "FaxFile", strTemp,strError);
- CoUninitialize();
Fun_ReadDBMS_IMAGE_Field 读取image类型函数
- /********************************************************************
- **【函 数 名:】 Fun_ReadDBMS_IMAGE_Field
- **【功能描述:】 读出数据库image字段
- **【功能描述:】
- **【参i 数:】 _RecordsetPtr pRst ADO记录集智能指针
- **【参i 数:】 LPCSTR lpFieldName 需要读取数据库字段的名称
- **【参i 数:】 lpOutFilePath 读出数据后,需要保存的文件位置
- **【参o 数:】 CString &stroutError 出现错误时,会导出错误信息
- **【返 回 值:】成功返回生成文件后的字节数,失败小于等于0
- **【作 者:】 艾俊
- **【日 期:】
- **【修 改 人:】
- **【日 期:】
- **【版 本:】
- ********************************************************************/
- LONG Fun_ReadDBMS_IMAGE_Field(_RecordsetPtr pRst, LPCSTR lpFieldName,
- LPCSTR lpOutFilePath, CString &stroutError)
- {
- _variant_t Holder;
- DWORD dwFileSize = 0;
- stroutError ="";
- try
- {
- dwFileSize = pRst->GetFields()->GetItem(lpFieldName)->ActualSize;
- if(dwFileSize < 1)
- {
- stroutError = "Fun_ReadDBMS_IMAGE_Field-> File Data size is 0";
- return 0;//文件大小为0
- }
- Holder = pRst->GetFields()->GetItem(lpFieldName)->GetChunk(dwFileSize);
- if(Holder.vt == (VT_ARRAY | VT_UI1))
- {
- char *pBuf = NULL;
- FILE *fp = NULL;
- SafeArrayAccessData(Holder.parray,(void **)&pBuf);
- fp = fopen(lpOutFilePath, "wb");
- if(fp == NULL)
- {
- SafeArrayUnaccessData (Holder.parray);
- stroutError = "Fun_ReadDBMS_IMAGE_Field-> write file error";
- return -1;
- }
- fwrite(pBuf, dwFileSize, 1, fp);
- fclose(fp);
- SafeArrayUnaccessData (Holder.parray);
- }
- else
- {
- stroutError = "Fun_ReadDBMS_IMAGE_Field-> Field is error";
- return -1;//文件大小为0
- }
- }
- catch(_com_error &e)
- {
- stroutError = "Error 0001 Fun_ReadDBMS_IMAGE_Field ";
- stroutError += (LPCSTR)e.Description();
- stroutError += "/r/n";
- stroutError += (LPCSTR)e.ErrorMessage();
- }
- return dwFileSize;
- }
其它打开数据库,返回记录集等同上,现在说说,如何把读出的二进制写入数据库的 image字段
C/C++ Code
- //这里的代码是添加一条新记录
- //先用二进制方式打开文件
- FILE *pFile = fopen("c://aa.bin", "rb");
- //lFileSize 假设已经得到了文件大小,不会获取文件大小的,在本站可以找到资助
- char *lpFileBuf = new char[1024];//分配1024个字节
- ADORecordset->AddNew();
- //分批将数据写入数据库
- while(lFileSize >= 1024)
- {
- fread(lpFileBuf, 1024, 1, pFile);
- WriteImageToDB(lpFileBuf, 1024, "FaxFile", ADORecordset);
- lFileSize -= 1024;
- }
- if (lFileSize > 0)
- {
- fread(lpFileBuf, lFileSize, 1, pFile);
- WriteImageToDB(lpFileBuf, lTemp, "FaxFile", ADORecordset);
- }
- ADORecordset->Update();
- if(pFile != NULL)
- {
- fclose(pFile);
- pFile = NULL;
- }
- if(lpFileBuf != NULL)
- {
- delete [] lpFileBuf;
- lpFileBuf = NULL;
- }
WriteImageToDB 写入函数(image类型字段)
- /********************************************************************
- **【函 数 名:】 WriteImageToDB
- **【功能描述:】 将二进制写入数据库
- **【功能描述:】
- **【参i 数:】 char* psrcBuf 指向需要写入的二进制数据地址
- **【参i 数:】 ULONG ulFileLen 需要写入的数据长度
- **【参i 数:】 const char *pfieldName 字段名
- **【参i 数:】 ADO 记录集 智能指针 _RecordsetPtr pRst
- **【返 回 值:】
- **【作 者:】 艾俊
- **【日 期:】
- **【修 改 人:】
- **【日 期:】
- **【版 本:】
- ********************************************************************/
- void WriteImageToDB(char* psrcBuf, ULONG ulFileLen, const char *pfieldName, _RecordsetPtr pRst)
- {
- VARIANT varBLOB;
- SAFEARRAY *psa;
- SAFEARRAYBOUND rgsabound[1];
- char *pBuf = NULL;
- pBuf = (char*)psrcBuf;
- if( NULL != psrcBuf)
- {
- rgsabound[0].lLbound = 0;
- rgsabound[0].cElements = ulFileLen;
- psa = SafeArrayCreate(VT_UI1, 1, rgsabound); //创建SAFEARRAY对象
- for (long i = 0; i < (long)ulFileLen; i++)
- SafeArrayPutElement (psa, &i, pBuf++); //将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
- varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
- varBLOB.parray = psa; //为varBLOB变量赋值
- pRst->GetFields()->GetItem(pfieldName)->AppendChunk(varBLOB); //加入BLOB类型的数据
- SafeArrayDestroy(psa);//后加
- }
- }
- image字段或二进制字段的读写
- richedit读写image字段
- 读写二进制字段数据
- 读写SQL数据库Image字段
- SQLITE3 读写二进制字段blob
- C# 对SQL Server 中Image字段的读写
- 转----java读写SQLServer2005的image型字段
- C# 对SQL Server中Image字段的读写
- .net C#,access,MDB数据库BLOB二进制字段的读写
- Flash/ActionScript读写SQLite二进制字段里的图片文件
- C#读写数据库Image字段实例
- c#读写MSSQL数据库image字段内容
- C#读写数据库Image字段实例
- python读写 sql server image字段
- 无效的字段名或字段索引
- text类型字段的读写
- C# 对SQL Server中Image字段的读写(2)
- 将数据库中的image字段(二进制字段)读出并转换为String
- 高速公路
- java ee必用工具下载地址
- 奇怪的电梯
- RFC3629
- OSGI:服务的发布和引用
- image字段或二进制字段的读写
- CRF中文分词开源版发布啦
- 自己写的第一个程序————学生信息管理系统
- 三道题~~
- nginx怎么启动平滑重启关闭
- 在线钢琴音乐微搏
- BGP 路由反射器(RR)和联邦
- nginx怎么加expire头
- 多思考,才能真正的提高!!!