mfc中ado上传image到sql数据库
生活随笔
收集整理的這篇文章主要介紹了
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);}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
? ? ? ?(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);}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的mfc中ado上传image到sql数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法解析的外部符号 __imp__tim
- 下一篇: vs2010文件加载使用简体中文(GB2