使用的是 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 方法关闭连接