MFC/VC中利用ADO调用存储查询、保存的操作

本文介绍如何通过ADO技术实现数据库连接、查询与保存操作。详细展示了如何在C++项目中利用ADO库创建连接、执行存储过程及处理结果集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值