1、在“stdafx.h”中加上下面语句:应用ADO库
#import"C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace\
rename("EOF" ,"adoEOF") rename("BOF","adoBOF")
2、在程序的头文件(*.h文件)定义万能指针
_ConnectionPtr m_conPtr;
_RecordsetPtr m_rsPtr;
_CommandPtr m_CommandPtr,m_CommSerachPtr;
_RecordsetPtr m_RecordsetPtr,m_SearchRecordPtr;
3、在(.cpp文件)使用查询、保存操作来执行存储过程
//初始化中连接数据库
BOOL CInsertDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
//连接数据库
try
{
HRESULT hr=m_conPtr.CreateInstance("ADODB.Connection");
if (SUCCEEDED(hr))
{
m_conPtr->CursorLocation=adUseClient;
m_conPtr->Open(_bstr_t(m_vagueSearch.GetDatabaseLink()),_bstr_t(""),_bstr_t(""),-1);//m_vagueSearch.GetDatabaseLink()),是调用一个函数加载连接在下面有此函数
}
}
//抛出异常
catch (_com_error e)
{
CString errMsg;
errMsg.Format("连接错误,原因:%s",e.ErrorMessage());
AfxMessageBox( errMsg);
return false ;
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//执行保存操作
void CInsertDlg::OnButtonInsert()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CString proc_name="";
//读取.ini文件(保存的存储过程名)
GetPrivateProfileString(m_receTable,"insert_proc","",proc_name.GetBuffer(MAX_PATH),MAX_PATH,m_vagueSearch.GetProcPath());
//当选择的栏目没有此存储过程,则proc_name为空
if(proc_name=="")
{
return;
}
proc_name.ReleaseBuffer();
m_procName = proc_name;
GetPrivateProfileString(m_receTable,"select_proc","",m_procSearch.GetBuffer(MAX_PATH),MAX_PATH,m_vagueSearch.GetProcPath());
//当选择的栏目没有此存储过程,则proc_name为空
m_procSearch.ReleaseBuffer();
if(m_procSearch=="")
{
return;
}
m_receTable.Replace(" ","");
CString strA="A";
if (m_receTable == "管理人")
{//调用此函数去执行存储过程
AddParam(strA);
}
}
void CInsertDlg::AddParam(CString strParam)
{
//以下执行查询和插入操作的存储过程
//创建参数对象,并给参数赋值
//查询时的存储过程调用
//查询
//创建comm
m_CommSerachPtr.CreateInstance( __uuidof(Command));
_ParameterPtr paramTYPE;
paramTYPE.CreateInstance(__uuidof(Parameter));
try
{
//添加传入存储过程参数
paramTYPE = m_CommSerachPtr->CreateParameter("TYPE",adVarChar,adParamInput,strParam.GetLength()+1,(_variant_t)(strParam));
m_CommSerachPtr->Parameters->Append(paramTYPE);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
m_CommSerachPtr->ActiveConnection =m_conPtr;
m_CommSerachPtr->CommandType = adCmdStoredProc;
m_CommSerachPtr->CommandText = _bstr_t(m_procSearch);
m_RecordsetPtr.CreateInstance(__uuidof(Recordset));
try
{
//执行查询存储过程
m_SearchRecordPtr=m_CommSerachPtr->Execute(NULL,NULL,adCmdStoredProc);
_variant_t var;
CString strValue;
while (!m_SearchRecordPtr->adoEOF)
{
var=m_SearchRecordPtr->GetCollect((_variant_t)(long)0); //取得结果集中第一个字段的值
if(var.vt!=VT_NULL)
{
strValue=(LPCSTR)_bstr_t(var);
strValue.TrimRight();
if (strValue == m_insertText)
{
MessageBox("有相同的ID,检查数据库……");
return;
}
}
m_SearchRecordPtr->MoveNext();
}
//以下雷同 用于调用保存存储过程
m_CommandPtr.CreateInstance( __uuidof(Command));
_ParameterPtr strInsertInfo;
paramTYPE.CreateInstance(__uuidof(Parameter));
try
{
//保存存储过程须多个参数
paramTYPE = m_CommandPtr->CreateParameter("TYPE",adVarChar,adParamInput,strParam.GetLength()+1,(_variant_t)(strParam));
参数1:"TYPE" 过程需要的参数名称(创建存储过程时候的参数名称)
参数2:adVarChar 对应在创建存储过程时候的类型,根据什么类型填充什么参数
参数3:adParamInput 表示此参数是传入到过程中,还有传出adParamoutput
参数4:strParam.GetLength()+1 要传入字符串长度
参数5:(_variant_t)(strParam) 传入字符,并要根据类型区转化操作
以下雷同:
m_CommandPtr->Parameters->Append(paramTYPE);
strInsertInfo = m_CommandPtr->CreateParameter("INFO",adVarChar,adParamInput,m_insertText.GetLength()+1,(_variant_t)(m_insertText));
m_CommandPtr->Parameters->Append(strInsertInfo);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
m_CommandPtr->ActiveConnection =m_conPtr;
m_CommandPtr->CommandType = adCmdStoredProc;
m_CommandPtr->CommandText = _bstr_t(m_procName);
m_SearchRecordPtr.CreateInstance(__uuidof(Recordset));
m_RecordsetPtr=m_CommandPtr->Execute(NULL,NULL,adCmdStoredProc);
MessageBox("插入成功!");
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
}
//上面调用此路径去连接数据库操作,我在此是把路径写到文件里,根据Debug所在的路径去加载
CString CVagueSearch::GetDatabaseLink()
{
CString open_database;
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径
CString strPath="";
CString exist_tab="";
strPath.Format("%s",exeFullPath);
strPath=strPath.Left(strPath.Find("UnityEditor.exe"));
strPath += "连接数据库.ini";
GetPrivateProfileString("database","linkdatabase","",open_database.GetBuffer(MAX_PATH),MAX_PATH,strPath);
open_database.ReleaseBuffer();
return open_database;
}