怎么样将图片保存到数据库里面里 如果我知道了图片的路径,我怎么样才能将图片保存到数据库里面中去啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void COleadoDlg::OnOK() { // TODO: Add extra validation here HRESULT hr; DWORD FileSize,count;// LONG num; char *pBuf; VARIANT varBLOB; SAFEARRAY *psa; VARIANT rgvFields; VARIANT rgvValues; CFile f; CFileException e; HGLOBAL hfilemem; SAFEARRAYBOUND rgsabound[1]; hr=CoInitialize(NULL); CString Constr,wCmdString,tempstr; CComPtr<ADOField> pField; if(FAILED(hr)) m_Conn = NULL; m_Rec = NULL; pFields = NULL; if(!f.Open(m_PhotoPath,CFile::modeRead,&e)) { AfxMessageBox("打开文件错误!"); return; } f.SeekToBegin(); FileSize=f.GetLength(); hfilemem=GlobalAlloc(GMEM_MOVEABLE,(FileSize)); if(!hfilemem) { ::AfxMessageBox("内存不够!"); return; } pBuf=(char *)GlobalLock(hfilemem); count=f.Read(pBuf,FileSize); if(count!=FileSize) { ::AfxMessageBox("数据错误"); f.Close(); return; } f.Close(); hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\ (REFIID)IID_IADOConnection,(LPVOID*)&m_Conn); if (FAILED(hr)) return ; hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\ (REFIID)IID_IADORecordset,(LPVOID*)&m_Rec); if (FAILED(hr)) return ; tempstr="E:\\练习\\MyApp\\数据库\\oleado\\oleado.mdb"; Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False"; hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified); if (FAILED(hr)) { ::AfxMessageBox("连接数据库错误!"); return ; } wCmdString=_T("select * from userphoto");// hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText); if (FAILED(hr)) { ::AfxMessageBox("打开表错误!"); return ; }/* 添加新的记录 需要两个参数 所以添加两个空的参数*/ rgvFields.vt = VT_ERROR; rgvFields.scode = DISP_E_PARAMNOTFOUND; rgvValues.vt = VT_ERROR; rgvValues.scode = DISP_E_PARAMNOTFOUND; UpdateData(); m_Rec->AddNew(rgvFields, rgvValues); m_Rec->put_Collect(CComVariant(1),(CComVariant)(m_UserName)); m_Rec->put_Collect(CComVariant(2),CComVariant((long)m_UseOld)); ///为新记录填充username字段 pField=NULL; if(pBuf) { rgsabound[0].lLbound = 0; rgsabound[0].cElements = FileSize; psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象 for (long i = 0; i < (long)FileSize; i++) SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中 varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组 varBLOB.parray = psa; ///为varBLOB变量赋值 m_Rec->get_Fields(&pFields);//加入BLOB类型的数据 pFields->get_Item(CComVariant(3),&pField); pField->AppendChunk(varBLOB);///加入BLOB类型的数据 } hr=m_Rec->Update(rgvFields, rgvValues); if(FAILED(hr)) { ::AfxMessageBox("保存失败!"); return ; } // m_Rec->UpdateBatch(adAffectAll); GlobalUnlock(hfilemem); GlobalFree(hfilemem); if(m_Rec) { m_Rec->Release(); } if(m_Conn) { m_Conn->Close(); m_Conn->Release(); } ::AfxMessageBox("个人资料保存成功"); m_PhotoPath.Empty(); m_UseOld=0; m_UserName.Empty(); SetDlgItemText(IDC_USERNAME, (LPCTSTR)" "); //在编辑框1中显示文件名 SetDlgItemInt(IDC_USEROLD,0);// UpdateData(TRUE); // CDialog::OnOK();}void COleadoDlg::OnSelectphoto() { // TODO: Add your control notification handler code here char Filter[]="图象文件(*.bmp;*.jpg)|*.bmp;*.jpg"; CFileDialog dlgOpen(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,(LPCTSTR)Filter,NULL);// Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||"; if(dlgOpen.DoModal()==IDOK) { m_PhotoPath=dlgOpen.GetPathName(); m_PhotoName=dlgOpen.GetFileName(); //取得要分割的文件名(不包含路径、扩展名) ShowPhoto(); }}注意 我使用的是ADO连接数据库ADOConnection* m_Conn;ADORecordset* m_Rec;//_RecordsetPtr m_Rec;ADOFields* pFields;///////设置ADO COM接口const IID IID_IADOConnection = {0x00000550,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};const CLSID CLSID_CADOConnection = {0x00000514,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};const IID IID_IADORecordset = {0x00000556,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};const CLSID CLSID_CADORecordset = {0x00000535,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};再STDAFX.H中加#include <adoid.h>#include <adoint.h>#include <icrsint.h>#include <atlbase.h> 参考msdn和http://www.codeguru.com c++链接 Access 并显示在窗体上 内存映射读取几G的txt文件? 怎样将xml的节点当作根来操作? 问下MFC现在在外面的情况怎么样啊 关于ClistBox 顺序表问题 如何实现根据下载任务实时显示下载进度条指示 fopen的第一个路径参数能用变量吗 谁有<<Windows网络编程技术>>源码, 发给我一份或网址???小弟不甚感激!!! 有那位大虾正在读或曾经读过《C++编程思想》吗?小弟不才以为书中有一个问题无法解释 请进 up有分 怎样初始化指针。 给出一个路径,怎么判断这个路径是一个文件还是一个文件夹?
{
// TODO: Add extra validation here
HRESULT hr;
DWORD FileSize,count;
// LONG num;
char *pBuf;
VARIANT varBLOB;
SAFEARRAY *psa;
VARIANT rgvFields;
VARIANT rgvValues;
CFile f;
CFileException e;
HGLOBAL hfilemem; SAFEARRAYBOUND rgsabound[1];
hr=CoInitialize(NULL);
CString Constr,wCmdString,tempstr;
CComPtr<ADOField> pField;
if(FAILED(hr))
m_Conn = NULL;
m_Rec = NULL;
pFields = NULL;
if(!f.Open(m_PhotoPath,CFile::modeRead,&e))
{
AfxMessageBox("打开文件错误!");
return;
}
f.SeekToBegin();
FileSize=f.GetLength();
hfilemem=GlobalAlloc(GMEM_MOVEABLE,(FileSize));
if(!hfilemem)
{
::AfxMessageBox("内存不够!");
return;
}
pBuf=(char *)GlobalLock(hfilemem);
count=f.Read(pBuf,FileSize);
if(count!=FileSize)
{
::AfxMessageBox("数据错误");
f.Close();
return;
}
f.Close();
hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\
(REFIID)IID_IADOConnection,(LPVOID*)&m_Conn);
if (FAILED(hr))
return ;
hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\
(REFIID)IID_IADORecordset,(LPVOID*)&m_Rec);
if (FAILED(hr))
return ;
tempstr="E:\\练习\\MyApp\\数据库\\oleado\\oleado.mdb";
Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False";
hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified);
if (FAILED(hr))
{
::AfxMessageBox("连接数据库错误!");
return ;
}
wCmdString=_T("select * from userphoto");//
hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText);
if (FAILED(hr))
{
::AfxMessageBox("打开表错误!");
return ;
}/* 添加新的记录 需要两个参数 所以添加两个空的参数*/
rgvFields.vt = VT_ERROR;
rgvFields.scode = DISP_E_PARAMNOTFOUND;
rgvValues.vt = VT_ERROR;
rgvValues.scode = DISP_E_PARAMNOTFOUND;
UpdateData();
m_Rec->AddNew(rgvFields, rgvValues);
m_Rec->put_Collect(CComVariant(1),(CComVariant)(m_UserName));
m_Rec->put_Collect(CComVariant(2),CComVariant((long)m_UseOld)); ///为新记录填充username字段
pField=NULL;
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = FileSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < (long)FileSize; i++)
SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
pFields->get_Item(CComVariant(3),&pField);
pField->AppendChunk(varBLOB);///加入BLOB类型的数据
}
hr=m_Rec->Update(rgvFields, rgvValues);
if(FAILED(hr))
{
::AfxMessageBox("保存失败!");
return ;
}
// m_Rec->UpdateBatch(adAffectAll);
GlobalUnlock(hfilemem);
GlobalFree(hfilemem);
if(m_Rec)
{
m_Rec->Release();
}
if(m_Conn)
{
m_Conn->Close();
m_Conn->Release();
}
::AfxMessageBox("个人资料保存成功");
m_PhotoPath.Empty();
m_UseOld=0;
m_UserName.Empty();
SetDlgItemText(IDC_USERNAME, (LPCTSTR)" "); //在编辑框1中显示文件名
SetDlgItemInt(IDC_USEROLD,0);
// UpdateData(TRUE);
// CDialog::OnOK();
}void COleadoDlg::OnSelectphoto()
{
// TODO: Add your control notification handler code here
char Filter[]="图象文件(*.bmp;*.jpg)|*.bmp;*.jpg";
CFileDialog dlgOpen(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,(LPCTSTR)Filter,NULL);
// Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
if(dlgOpen.DoModal()==IDOK)
{
m_PhotoPath=dlgOpen.GetPathName();
m_PhotoName=dlgOpen.GetFileName(); //取得要分割的文件名(不包含路径、扩展名)
ShowPhoto();
}}
注意 我使用的是ADO连接数据库
ADOConnection* m_Conn;
ADORecordset* m_Rec;
//_RecordsetPtr m_Rec;
ADOFields* pFields;
///////设置ADO COM接口
const IID IID_IADOConnection =
{0x00000550,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
const CLSID CLSID_CADOConnection =
{0x00000514,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
const IID IID_IADORecordset =
{0x00000556,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
const CLSID CLSID_CADORecordset =
{0x00000535,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};再STDAFX.H中加
#include <adoid.h>
#include <adoint.h>
#include <icrsint.h>
#include <atlbase.h>