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

 

使用的是 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值