VC++ ADO 操作 SQL Server 2005 数据库

    技术2022-05-18  14

     

    使用的是 VS2008 自带的 SQL Server 2005 Express首先 开启TCP/IP协议,SQL Server Configuration Manager -> SQL Server 2005 网络配置 -> SQLEXPRESS 的协议 -> TCP/IP 启用SQL Server 2005 TCP/IP 默认使用 2523 TCP 端口。

     

    打开 Microsoft SQL Server Management Studio Express , 服务器属性,服务器身份验证选择 SQL Server 和 Windows 身份验证模式;安全性 -> 登录名 -> sa ,打开属性,重新设置密码,"状态"选择登陆为"启用"。

     

    ADO  有7种对象Connection , Command , Parameter , Recordset , Error , Property

     

    必须使用 #import 指令导入 msado15.dll 库

     

    #import "C:/Program Files/Common Files/System/ADO/msado15.dll" / no_namespace  rename("EOF", "adoEOF"),rename("BOF","adoBOF")

     

    class ADOConnection 是用于连接SQL Server 的自定义类,其提供了几个公共接口:

     

    ConnectDBWithSQLServerAuth //使用SQL Server验证模式连接到数据库ExecuteSQL       //执行SQL命令GetRecordString  // 当使用 SELECT 命令时,获取返回的记录集GetErrMsg        //获取错误消息ExitConnect      //退出连接

     

    其私有数据成员为:

     

     _ConnectionPtr m_pConnection;//添加一个指向Connection对象的指针 _RecordsetPtr m_pRecordset;  //记录集对象指针 _CommandPtr m_pCommand; //命令对象指针 CString errMsg; //错误消息

    ADOConnection 构造函数和析构函数中必须调用 COM 装载函数和卸载函数 CoInitialize , CoUninitialize

     

    ConnectDBWithSQLServerAuth函数要求用户提供SQL SERVER IP地址,端口,userID,password, 使用的数据库

     

    bool ADOConnection::ConnectDBWithSQLServerAuth( CString &serverIP, int port,  CString &userID, CString &password, CString database){

     CString connectString; connectString.Format(_T("Provider=SQLOLEDB;Driver={SQL Server};Server=%s,%d;DATABASE=%s;"),  serverIP,port,database);

     try {  if (!SUCCEEDED(m_pConnection.CreateInstance(__uuidof(Connection))))  {   m_pConnection = NULL;   errMsg=(_T("Database CreateInstance failed"));   return false;  }

      if (!SUCCEEDED(m_pRecordset.CreateInstance(__uuidof(Recordset))))  {   m_pRecordset = NULL;   errMsg=(_T("Recordset CreateInstance Failed!"));   return false;  }

      if (!SUCCEEDED(m_pCommand.CreateInstance(__uuidof(Command))))  {   m_pCommand = NULL;   errMsg=(_T("Command CreateInstance Failed!"));   return false;  }

      m_pConnection->Open(connectString.GetBuffer(),userID.GetBuffer(),password.GetBuffer(),adModeUnknown);

      m_pCommand->ActiveConnection = m_pConnection; } catch (_com_error e) {

      errMsg=LPCTSTR(e.Description());  return false; }

     return true;}

     

    一旦连接成功,就可以使用 ExecuteSQL 函数执行操作命令。ExecuteSQL 函数要求用户提供一个标准 SQL命令、接收缓冲区、影响的行数变量注意,只有使用 SELECT 命令,_CommandPtr 对象的方法 Execute 才会返回记录集,其他方法会将 _RecordsetPtr 对象的状态设置为关闭

     

    bool ADOConnection::ExecuteSQL(_bstr_t bstrSQL,CString &buff,_variant_t &RecordsAffectedCount){ if(m_pConnection == NULL || m_pRecordset == NULL || m_pCommand == NULL) {  errMsg=_T("m_pConnection == NULL || m_pRecordset == NULL || m_pCommand == NULL");  return false; }

     m_pCommand->CommandText=bstrSQL; _variant_t vNULL; vNULL.vt=VT_ERROR; vNULL.scode=DISP_E_PARAMNOTFOUND;

     try {    m_pRecordset=m_pCommand->Execute(&vNULL,&vNULL,adCmdText);  RecordsAffectedCount=vNULL; } catch(_com_error e)  //捕捉异常 {

      errMsg=LPCTSTR(e.Description());  return false; }

     if(m_pRecordset->State & adStateOpen) {  GetRecordString(m_pRecordset,buff); }

     return true;}

    GetRecordString 函数使用 _RecordsetPtr 对象的 recordptr->GetFields()->Count 方法获取基表中列的总数,recordptr->GetFields()->GetItem((long)i)->GetName() 获取列的名称;recordptr->GetFields()->GetItem((long)i)->GetType() 获取列的类型;

     

    recordptr->MoveFirst(); 移动记录指针到第一行;recordptr->MoveNext() 移动记录指针到下一行;recordptr->GetCollect 获取记录

     

    基表中的列代表对象的属性,一行代表一个对象。

     

    ExitConnect 函数使用 Close 方法关闭连接


    最新回复(0)