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