mfc中ado上传image到sql数据库

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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值