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);
}