mfc中ado上传image到sql数据库

来源:互联网 发布:淘宝开店考试入口 编辑:程序博客网 时间:2024/06/09 21:22
mfc中ado上传image到sql server数据库
一.关于mfc的使用就不在此献丑了,直接讲ado连接sql server数据库。
   1.我采用的是连接方法是调用一个udl文件中的数据库配置。
       (1)新建一个txt文件,名字自己取,然后把txt改为udl扩展名,如下图。
                  
       (2)双击打开adosql.udl,如下图红色矩形操作。
                    
                    
      2.mfc中连接数据库代码。
在stdafx.h中加入以下代码:
</pre><pre name="code" class="cpp">#import "c:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOCG")  rename("EOF","adoEOF")using namespace ADOCG;
我在mfc界面上加了个按钮,点击时就去连接数据库。连接代码如下:
::CoInitialize(NULL);    _ConnectionPtr m_pConnection;    _CommandPtr m_pCommand;      HRESULT hr;    hr=m_pConnection.CreateInstance(__uuidof(Connection));     m_pConnection->ConnectionString="File Name=adosql.udl"; try { if(SUCCEEDED(hr)) { //hr=m_pConnection->Open(_bstr_t(L"Provider=SQLOLEDB.1;Persist Security Info=False;UInitial Catalog=CXKENSDyeingERP;Data Source=192.168.160.3"),_bstr_t (L"sa"),_bstr_t (L"king"),adModeUnknown); hr=m_pConnection->Open(m_pConnection->ConnectionString,L"",L"",adModeUnknown); } } catch(_com_error & err) { AfxMessageBox(err.Description(),MB_OK,0); AfxMessageBox(err.ErrorMessage(),MB_OK,0); MessageBox(_T("无法连接SQL SERVER 服务器,程序将退出。请检查网络设备"),MB_OK,0); return; }
二.连接之后就该数据传输了,有一点要注意的,因为我在这要把图片的数据直接传到sql server,然后我的图片大小一幅为4M,所以要在mfc中设置堆栈大小,如下图:


接下来就可以数据直接上传了,我采用的_CommandPtr m_pCommand来上传数据。
char  filename[100]="";GetDlgItemText(IDC_FILENAME,filename,100);if(strcmp(filename,"")==0){MessageBox("不能为空!");return;}CString strtxt="";strtxt+="D:/相机异常图片/";CString imagepathtemp=strtxt;strtxt+=filename;strtxt+="/上传日志.txt"; //执行储存过程CString cvar1,cvar2, cvar3,cvar4,cvar5;cvar1=filename;                      //卡号,即卷号 cvar2="有疵点";                     //疵点 cvar3="无";                         //备注 //cvar4="12.50米";                    //长度 //cvar5="左边13.68厘米";              //位置  //读取“上传日志.txt中内容”CStdioFile File;File.Open(strtxt,CFile::modeRead);CString strtemp;while(File.ReadString(strtemp))//while循环读取每一行字符{      cvar4=strtemp;                    //长度  File.ReadString( cvar5);   try { m_pCommand.CreateInstance(__uuidof(Command)); m_pCommand->ActiveConnection=m_pConnection; m_pCommand->CommandType=adCmdStoredProc; m_pCommand->CommandText=_bstr_t("dbo.qmOnlineCheckWriteData"); _variant_t vvar1,vvar2,vvar3,vvar4,vvar5; vvar1=_variant_t(_bstr_t(cvar1)); vvar2=_variant_t(_bstr_t(cvar2)); vvar3=_variant_t(_bstr_t(cvar3)); vvar4=_variant_t(_bstr_t(cvar4)); vvar5=_variant_t(_bstr_t(cvar5)); _ParameterPtr mp_var1,mp_var2,mp_var3,mp_var4,mp_var5,mp_var6; mp_var1.CreateInstance(__uuidof(Parameter)); mp_var2.CreateInstance(__uuidof(Parameter)); mp_var3.CreateInstance(__uuidof(Parameter)); mp_var4.CreateInstance(__uuidof(Parameter)); mp_var5.CreateInstance(__uuidof(Parameter)); mp_var6.CreateInstance(__uuidof(Parameter)); mp_var1=m_pCommand->CreateParameter ( _bstr_t("卡号"), adVarChar, adParamInput, 50, vvar1 ); m_pCommand->Parameters->Append(mp_var1); mp_var2=m_pCommand->CreateParameter (_bstr_t("疵点"), adVarChar, adParamInput, 50, vvar2 );  m_pCommand->Parameters->Append(mp_var2); mp_var3=m_pCommand->CreateParameter ( _bstr_t("备注"),  adVarChar, adParamInput, 500, vvar3 ); m_pCommand->Parameters->Append(mp_var3); mp_var4=m_pCommand->CreateParameter ( _bstr_t("长度"), adVarChar, adParamInput, 50, vvar4 ); m_pCommand->Parameters->Append(mp_var4); mp_var5=m_pCommand->CreateParameter (_bstr_t("位置"), adVarChar, adParamInput, 50, vvar5 );  m_pCommand->Parameters->Append(mp_var5);  CString imagepath = "";  File.ReadString( imagepath);  imagepath=imagepathtemp+imagepath; VARIANT varChunk;SAFEARRAY* psa;SAFEARRAYBOUND rgsabound[1];CFile f(imagepath.operator LPCTSTR(),CFile::modeRead);BYTE bval[4195382+1];long uIsRead=0;while (1){      uIsRead=f.Read(bval,4195382);      if (uIsRead==0)   break;     rgsabound[0].cElements=uIsRead;      rgsabound[0].lLbound=0;      psa=SafeArrayCreate(VT_UI1,1,rgsabound);      for (long index=0;index<uIsRead;index++)      {          if (FAILED(SafeArrayPutElement(psa,&index,&bval[index])))          AfxMessageBox(_T("错误。"));      }      varChunk.vt =VT_ARRAY|VT_UI1;      varChunk.parray=psa;     if (uIsRead<4195382)  break; }  mp_var6=m_pCommand->CreateParameter (   _bstr_t("图片"), adBinary, adParamInput, 5000000, varChunk );   m_pCommand->Parameters->Append(mp_var6);     VariantClear(&varChunk);      SafeArrayDestroyData(psa);     f.Close(); _variant_t vNull; vNull.vt=VT_ERROR; vNull.scode=DISP_E_PARAMNOTFOUND; m_pCommand->Execute(&vNull,&vNull,adCmdStoredProc); //cvar2=mp_var2->Value.bstrVal;// cvar3=mp_var3->Value; } catch(_com_error &error) { MessageBox(error.ErrorMessage(),_T("ADO错误!")); MessageBox(error.Description(),_T("ADO错误!")); return; }}File.Close();
m_pConnection->Close();//断开连接 CoUninitialize();//释放


其中传输图片的核心代码如下:
 CString imagepath = "";  File.ReadString( imagepath);  imagepath=imagepathtemp+imagepath; VARIANT varChunk;SAFEARRAY* psa;SAFEARRAYBOUND rgsabound[1];CFile f(imagepath.operator LPCTSTR(),CFile::modeRead);BYTE bval[4195382+1];long uIsRead=0;while (1){      uIsRead=f.Read(bval,4195382);      if (uIsRead==0)   break;     rgsabound[0].cElements=uIsRead;      rgsabound[0].lLbound=0;      psa=SafeArrayCreate(VT_UI1,1,rgsabound);      for (long index=0;index<uIsRead;index++)      {          if (FAILED(SafeArrayPutElement(psa,&index,&bval[index])))          AfxMessageBox(_T("错误。"));      }      varChunk.vt =VT_ARRAY|VT_UI1;      varChunk.parray=psa;     if (uIsRead<4195382)  break; }  mp_var6=m_pCommand->CreateParameter (   _bstr_t("图片"), adBinary, adParamInput, 5000000, varChunk );   m_pCommand->Parameters->Append(mp_var6);     VariantClear(&varChunk);      SafeArrayDestroyData(psa);     f.Close(); _variant_t vNull; vNull.vt=VT_ERROR; vNull.scode=DISP_E_PARAMNOTFOUND; m_pCommand->Execute(&vNull,&vNull,adCmdStoredProc); }




0 0
原创粉丝点击