开始一个项目并添加代码演示了添加图片或删除图像BLOB字段的数据库文件:
首先创建一个数据库文件(DB1.MDB)与下面列出的字段,在运行本教程之前。
字段名 | 类型 |
---|---|
图像 | OleObject |
大小 | 数量 |
开始一个新项目如下:运行Microsoft Visual Studio,选择新项目文件,并执行以下操作:
在overview窗口点击Next。
在应用程序类型步对话框中,执行以下操作:
4步骤2的对话框中,执行以下操作:
4步骤3的对话框中,单击Finish:
# include语句添加到您的程序可以访问的c++类库常量和类:
将下面几行添加到文件的末尾(记住,你可能不得不改变头文件所在的路径):
# include“. . \ \ . \ \ . . \ \ . \ \ . . \ \ \ \ ClassLib \ \ ltWrappr.h包括“
静态文本控件添加到主窗口如下:
# import语句添加到您的程序可以访问Microsoft ActiveX数据对象2.6库:
将下面几行添加到文件的末尾(记住,你可能需要改变文件名为. tlb所在的路径):
#进口< C: \ \ \ \ Windows \ \ \ \ system32系统\ \ \ \ msado26。tlb >重命名(“EOF”,“ADOEOF”)
使用名称空间ADODB;
单击资源视图选项卡。在视图菜单中,选择工具箱,然后添加六个命令按钮的表单和名称如下:
ID | 标题 |
---|---|
IDC_CONNECT | 相距到数据库 |
IDC_DISCONNECT | 从数据库断开连接 |
IDC_ADDRECORD | 添加记录 |
IDC_DELETERECORD | D&elete记录 |
IDC_MOVENEXT | 移动下一个 |
IDC_MOVEPREVIOUS | 移动之前 |
保存的资源文件。
执行以下步骤添加m_btnAddRecord CImageBlobDlg类变量和链接到CButton控制使用动态数据交换:
重复步骤11其他按钮,使用下面的变量名:
ID | 成员变量名 |
---|---|
IDC_MOVEPREVIOUS | m_btnMovePrevious |
IDC_MOVENEXT | m_btnMoveNext |
IDC_DISCONNECT | m_btnDisconnect |
IDC_DELETERECORD | m_btnDeleteRecord |
IDC_CONNECT | m_btnConnect |
添加以下CImageBlobDlg类的成员变量:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
LBitmapWindow m_LBitmapWnd;
去OnInitDialog()函数如下:
编辑OnInitDialog()函数来添加以下代码行后说/ / TODO:添加额外的初始化
:
LBase: LoadLibraries (LT_KRN);
LBase: LoadLibraries (LT_DIS);
LBase: LoadLibraries (LT_FIL);
矩形钢筋混凝土;
GetDlgItem (IDC_STATIC) - > GetWindowRect (rc);
ScreenToClient (rc);
HWND HWND = m_LBitmapWnd.CreateWnd (这- > GetSafeHwnd () 0 WS_VISIBLE | L_BS_CENTER | L_BS_PROCESSKEYBOARD, rc。离开了,rc。rc。对,rc.bottom);
m_LBitmapWnd.EnableAutoScroll(真正的);
m_LBitmapWnd。SetFileName (MAKE_IMAGE_PATH(文本(“image1.cmp”)));
intnRet = m_LBitmapWnd。负载(0 ORDER_BGR 1);
HRESULT人力资源;
CoInitialize(空);
hr = m_pConnection。调用CreateInstance (__uuidof(连接));
m_pRecordset.CreateInstance (__uuidof(记录集));
m_btnMoveNext.EnableWindow(假);
m_btnMovePrevious.EnableWindow(假);
m_btnAddRecord.EnableWindow(假);
m_btnDeleteRecord.EnableWindow(假);
执行以下操作将事件处理程序添加到吗连接到数据库按钮:
HRESULT人力资源;
_bstr_t bstrConnection (”提供者= Microsoft.Jet.OLEDB.4.0;数据源= d: \ \ temp \ \ DB1.mdb;“);
_bstr_t bstrQuery (“SELECT * FROM图像”);
_variant_t vNull;
vNull。vt = VT_ERROR;
vNull。范围= DISP_E_PARAMNOTFOUND;
如果(m_pConnection - >状态= = adStateClosed)
{
hr = m_pConnection - >打开(bstrConnection _bstr_t (L”“),_bstr_t (L”“),adModeUnknown);
}
如果(成功(人力资源)
{
m_pRecordset - > PutRefActiveConnection (m_pConnection);
hr = m_pRecordset - >打开(_variant_t (bstrQuery) vNull, adOpenKeyset, adLockOptimistic, adCmdText);
如果(成功(人力资源)
{
如果(! m_pRecordset - > GetBOF ())
{
m_pRecordset - > MoveFirst ();
}
如果(! m_pRecordset - > GetADOEOF ())
{
m_btnMoveNext.EnableWindow(真正的);
m_btnMovePrevious.EnableWindow(真正的);
m_btnDeleteRecord.EnableWindow(真正的);
}
m_btnAddRecord.EnableWindow(真正的);
}
}
执行以下操作将事件处理程序添加到吗断开数据库按钮:
如果(m_pConnection - >状态= = adStateOpen)
{
m_pConnection - > Close ();
}
如果(m_pRecordset - >状态= = adStateOpen)
{
m_pRecordset - > Close ();
}
m_btnMoveNext.EnableWindow(假);
m_btnMovePrevious.EnableWindow(假);
m_btnAddRecord.EnableWindow(假);
m_btnDeleteRecord.EnableWindow(假);
执行以下操作将事件处理程序添加到吗添加记录按钮:
L_SIZE_T nSize;
intnRet;
LMemoryFile LeadMemFile;
LBuffer LeadMemBuffer;
如果(m_pConnection - >状态= = adStateClosed)
{
对话框(文本(“连接关闭”));
返回;
}
LeadMemFile。SetBitmap ((LBitmapBase *) &m_LBitmapWnd);
nRet = LeadMemFile.Save (QS &LeadMemBuffer FILE_LEAD, 24日);
nSize = LeadMemBuffer.GetSize ();
字节* pData =(字节*)LeadMemBuffer.Lock ();
varBLOB变体;
BlobToVariant (varBLOB pData(长)nSize);
LeadMemBuffer.Unlock ();
LeadMemBuffer.Free ();
m_pRecordset - > AddNew ();
m_pRecordset l[0] - > - >字段项- > AppendChunk (varBLOB);
m_pRecordset - >字段- >项目[1 l] - > PutValue((长)nSize);
m_pRecordset - >更新();
VariantClear (&varBLOB);
如果(m_pRecordset - > RecordCount > = 0)
{
m_btnMoveNext.EnableWindow(真正的);
m_btnMovePrevious.EnableWindow(真正的);
m_btnDeleteRecord.EnableWindow(真正的);
}
执行以下操作将事件处理程序添加到吗删除记录按钮:
如果(m_pConnection - >状态= = adStateClosed)
{
对话框(文本(“连接关闭”));
返回;
}
如果(! m_pRecordset - > GetBOF () | | ! m_pRecordset - > GetADOEOF ())
{
m_pRecordset - > MoveLast ();
m_pRecordset - > Delete (adAffectCurrent);
m_pRecordset - >更新();
如果(m_pRecordset - > RecordCount < = 0)
{
m_btnMoveNext.EnableWindow(假);
m_btnMovePrevious.EnableWindow(假);
m_btnDeleteRecord.EnableWindow(假);
}
}
执行以下操作将事件处理程序添加到吗移动下一个按钮:
如果(m_pConnection - >状态= = adStateClosed)
{
对话框(文本(“连接关闭”));
返回;
}
如果(! m_pRecordset - > GetADOEOF ())
{
m_pRecordset - > MoveNext ();
}
如果(m_pRecordset - > GetADOEOF ())
{
对话框(文本(“从db无法获得的图像”));
m_pRecordset - > MovePrevious ();
}
其他的
{
ReadImage ();
}
执行以下操作将事件处理程序添加到吗移动之前按钮:
如果(m_pConnection - >状态= = adStateClosed)
{
对话框(文本(“连接关闭”));
返回;
}
如果(! m_pRecordset - > GetBOF ())
{
m_pRecordset - > MovePrevious ();
}
如果(m_pRecordset - > GetBOF ())
{
对话框(文本(“从db无法获得的图像”));
m_pRecordset - > MoveNext ();
}
其他的
{
ReadImage ();
}
去ImageBlobDlg。h文件然后添加以下函数声明:
afx_msg无效OnClose ();
无效BlobToVariant(变体&varArray字节* pData,长lSize);
无效ReadImage ();
去ImageBlobDlg。cpp文件然后添加以下行BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间:
ON_WM_CLOSE ()
ImageBlobDlg.cpp添加以下功能:
无效CImageBlobDlg: OnClose ()
{
如果(m_LBitmapWnd.IsAllocated ())
{
m_LBitmapWnd.Free ();
}
LBase: UnloadLibraries (LT_KRN);
LBase: UnloadLibraries (LT_DIS);
LBase: UnloadLibraries (LT_FIL);
CoInitialize(空);
CDialog: OnClose ();
}
无效&varArray CImageBlobDlg:: BlobToVariant(变种,字节* pData,长lSize)
{
字节* pByte;
SAFEARRAY远* psa;
SAFEARRAYBOUND rgsabound [1];
rgsabound [0]。lLbound = 0;
rgsabound [0]。cElements = lSize;
/ /创建一个单一空间的字节数组
psa = SafeArrayCreate (VT_I1 1 rgsabound);
/ /设置数组的数据编辑框中的数据
如果(SafeArrayAccessData (psa (无效* *)&pByte) = = NOERROR)
memcpy (pByte(值),(值)pData lSize);
SafeArrayUnaccessData (psa);
varArray。vt = VT_ARRAY | VT_UI1;
varArray。parray = psa;
}
无效CImageBlobDlg: ReadImage ()
{
长nSize;
字节* pData =零;
LMemoryFile LeadMemFile;
intnRet;
_variant_t varSize;
varSize = m_pRecordset - - > >字段项[1 l] - >价值;
nSize = varSize.intVal;
/ /免费的旧图片
m_LBitmapWnd.Free ();
对话框(文本(“老形象释放”));
如果(nSize)
{
_variant_t varBLOB;
VariantInit (&varBLOB);
/ /获得数据的一部分
varBLOB = m_pRecordset - - > >字段项l [0] - > GetChunk (nSize);
pData =(字节*)malloc (nSize);
memset (pData 0 nSize);
如果(varBLOB。vt = = (VT_ARRAY | VT_UI1))
{
字节* pBuf =零;
SafeArrayAccessData (varBLOB.parray, (无效* *)pbuf);
LeadMemFile。SetBitmap ((LBitmapBase *) &m_LBitmapWnd);
LBuffer LeadMemBuffer (pBuf nSize);
nRet = LeadMemFile。负载(ORDER_BGR LeadMemBuffer, 24日,NULL);
SafeArrayUnaccessData (varBLOB.parray);
}
}
}
创建一个新文件Imports.cpp它在你的项目文件。
# include“StdAfx.h”
#如果定义(WIN64)
# pragma评论(自由,“. . \ \ . \ \ . . \ \ . \ \ . . \ \ Lib \ \ CDLLVC10 \ \ x64 \ \ Ltwvc_x.lib”)
#其他的
# pragma评论(自由,“. . \ \ . \ \ . . \ \ . \ \ . . \ \ Lib \ \ CDLLVC10 \ \ Win32 \ \ Ltwvc_u.lib”)
# endif/ / #如果定义(WIN64)
在主菜单中,选择构建- >构建ImageBlob。exe构建项目。
在主菜单中,选择建立ImageBlob - >执行。exe运行项目。
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗Web查看器net
188宝金博怎么下载
支持的平台上
net, Java, Android和iOS / macOS组件
C / c++类库的API
HTML5 JavaScript库
你的邮件已经发送到支持!有人应该联系!如果你的问题是紧急请回到聊天。
聊天时间:
周一——周五,上午6点等
谢谢你的反馈!
请填写表单重新开始一个新的聊天。
所有代理目前离线。
聊天时间:
周一-周五
早上8:30 - 6点
联系我们请填写这张表格,我们将通过电子邮件联系你。