ADO中最重要的对象有三个:Connection、Recordset和Command
2015-05-14 09:45
316 查看
ConnectionPtr:
_ConnectionPtr m_pConnection;
HRESULT hr;
try{
hr = m_pConnection.CreateInstance(_uuidof(Connection));///创建Connection实例
if(SUCCEEDED(hr)){
m_pConnection->ConnectionTimeout=600;//设置连接超时时间
m_pConnection->CommandTimeout=120;//设置执行命令超时时间
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=My.mdb","","",adModeUnknown);///连接数据库
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
return FALSE;
}
// 关闭ADO连接状态
if (m_pConnection->GetState() == adStateOpen)
{
m_pConnection->Close();
}
if (m_pConnection)
{
m_pConnection.Release();
m_pConnection = NULL;
}
_RecordsetPtr:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(bstrSQL,_variant_t((IDispatch*)pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
if (m_pRecordset->GetState() == adStateOpen)
{
m_pRecordset->Close();
}
if (m_pRecordset)
{
m_pRecordset.Release();
m_pRecordset = NULL;
}
_CommandPtr:
_CommandPtr pCommandPtr;
try
{
hr = pCommandPtr.CreateInstance(_uuidof(Command));
if (SUCCEEDED(hr))
{
pCommandPtr->put_ActiveConnection(_variant_t((IDispatch*)pConnection,true));
pCommandPtr->CommandText=_bstr_t(strinSQL);
pCommandPtr->Execute(NULL,NULL,adCmdText);
}
}catch(_com_error *e)
{
return;
}
ADO中最重要的对象有三个:Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。
三个对象对应的智能指针分别是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。
ADO使用_ConnectionPtr这个指针来操纵Connection对象,类似地,后面用到的_CommandPtr和_RecordsetPtr分别表示命令对象指针和记录集对象指针。
Connection对象是这三个对象的基础,它的主要作用是建立与数据库的连接,建立了与数据库的连接后,才能进行其它有关数据库的访问和操作。也就是说,使用ADO操作数据库,通常先用Connection对象的Open方法打开一个库连接,然后才能进行数据库的操作。操作完成后,要关闭这个库连接。
本文只讲述Connection对象最常用的Open方法和Execute方法。
注意:在使用ADO进行操作之前,必须使用AfxOleInit()函数来进行初始化;
1. Open()方法
用于打开一个库连接,而Execute()方法一般用于执行一条SQL语句。
_ConnectionPtr智能指针的用法:
首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数建立与数据源的连接。
在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。
_ConnectionPtr智能指针Open()方法的原型:
Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)
ConnectionString为连接字串,UserID是用户名,Password是登陆密码
Options是连接选项,可以是如下几个常量:
1> adModeUnknown 缺省,当前的许可权未设置
2> adModeRead 只读
3> adModeWrite 只写
4> adModeReadWrite 可以读写
5> adModeShareDenyRead 阻止其它Connection对象以读权限打开连接
6> adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接
7> adModeShareExclusive 阻止其它Connection对象打开连接
8> adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接
2. Execute方法
函数原型:
_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)
参数:
CommandText是命令字串,通常是SQL命令,
RecordsAffected是操作完成后所影响的行数
Options表示CommandText中内容的类型,可以取下列值之一:
1> adCmdText 表明CommandText是文本命令
2>adCmdTable 表明CommandText是一个表名
3>adCmdProc 表明CommandText是一个存储过程
4>adCmdUnknown 未知
Execute执行完后返回一个指向记录集的指针(_RecordsetPtr类型)
3. 异常捕获
出现的异常为:_com_error
控件名称 ID 用途
按钮 IDC_BTN_INSERT_INTO 执行INSERT INTO语句
按钮 IDC_BTN_UPDATE 执行Update语句
按钮 IDC_BTN_SELECT 执行SELECT语句
列表框 IDC_LIST1 显示SELECT语句执行结果
void CConnPtr_Open_ExeDlg::OnBtnInsertInto()
{
_ConnectionPtr m_pConnection;
_variant_t RecordsAffected;
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
return;
}
try
{
_bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";
m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
if(m_pConnection->State)
{
m_pConnection->Close();
}
}
双击IDC_BTN_UPDATE按钮,并编辑OnBtnUpdate()函数如下:
void CConnPtr_Open_ExeDlg::OnBtnUpdate()
{
_ConnectionPtr m_pConnection;
_variant_t RecordsAffected;
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
return;
}
try
{
_bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";
m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
if(m_pConnection->State)
{
m_pConnection->Close();
}
}
双击IDC_BTN_SELECT按钮,并编辑OnBtnSelect()函数如下:
void CConnPtr_Open_ExeDlg::OnBtnSelect()
{
_ConnectionPtr m_pConnection;
_variant_t RecordsAffected;
_RecordsetPtr m_pRecordset;
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
return;
}
try
{
m_pRecordset.CreateInstance("ADODB.Recordset"); //为Recordset对象创建实例
_bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";
m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
_variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;
try
{
while(!m_pRecordset->adoEOF)
{
vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));
//取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
vFirstName=m_pRecordset->GetCollect("FirstName");
vLastName=m_pRecordset->GetCollect("LastName");
vHireDate=m_pRecordset->GetCollect("HireDate");
vCity=m_pRecordset->GetCollect("City");
CString strtemp;
if(vEmployeeID.vt!=VT_NULL)
{
strtemp.Format("%d",vEmployeeID.lVal);
}
if(vFirstName.vt!=VT_NULL)
{
strtemp+=" ";
strtemp+=(LPCTSTR)(_bstr_t)vFirstName;
}
if(vLastName.vt!=VT_NULL)
{
strtemp+=" ";
strtemp+=(LPCTSTR)(_bstr_t)vLastName;
}
if(vHireDate.vt!=VT_NULL)
{
strtemp+=" ";
strtemp+=(LPCTSTR)(_bstr_t)vHireDate;
}
if(vCity.vt!=VT_NULL)
{
strtemp+=" ";
strtemp+=(LPCTSTR)(_bstr_t)vCity;
}
m_list1.AddString(strtemp);
m_list1.AddString("\n");
//移动到下一条记录
m_pRecordset->MoveNext();
}
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
m_pRecordset->Close();
m_pRecordset=NULL;
m_pConnection->Close();
m_pConnection=NULL;
}
附加操作(重要):
1> 在stdafx.h中加入如下语句:
#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF","adoEOF")
2> 在BOOL CConnPtr_Open_ExeApp::InitInstance()函数中加入:
AfxOleInit();
该部分演示了如何使用_ConnectionPtr接口开发ACCESS数据库:先创建一个Connection对象实例,然后用Open方法打开一个库连接,最后使用Execute方法执行SQL语句进行其它有关数据库的访问和操作。
oracle连接字符串
CString strConnect = _T("DRIVER=Oracle ODBC Driver;UID=xxx;PWD=xxx;DBQ=xxx;SERVER=xxx;QTO=F;");
//CString strConnect = _T("Provider=OraOLEDB.Oracle;User ID=xxx;Password=xxx;Persist Security Info=True;Data Source=xxx");
m_pConnection->ConnectionTimeout=600;//设置连接超时时间
m_pConnection->CommandTimeout=120;//设置执行命令超时时间
获取状态:
m_pConnection->GetState() == adStateOpen
关闭:
m_pConnection->Close();
m_pConnection.Release();
m_pConnection = NULL;
另:
CommandPtr:
_CommandPtr pCommandPtr;
try
{
hr = pCommandPtr.CreateInstance(_uuidof(Command));
if (SUCCEEDED(hr))
{
pCommandPtr->put_ActiveConnection(_variant_t((IDispatch*)pConnection,true));
pCommandPtr->CommandText=_bstr_t(strinSQL);
pCommandPtr->Execute(NULL,NULL,adCmdText);
}
}catch(_com_error *e)
{
return;
}
if (pCommandPtr)
{
pCommandPtr.Release();
pCommandPtr = NULL;
}
ado调用存储过程:
以下步骤的前提条件:COM ADO库已初始化,已经设置_ConnectionPtr连接对象。
步骤一: 创建 _CommandPtr 对象并初始化
_CommandPtr pCommand;pCommand.CreateInstance(__uuidof(Command));
步骤二:设置_CommandPtr 对象的属性
1)设置连接字符串pCommand->ActiveConnection = < _ConnectionPtr 类型的变量>;//连接字符串
例如:pCommand->ActiveConnection = m_OraDateBase.m_pConnection;
2) 标记该操作为存储过程 (如果存储过程输出参数为记录集,忽略此步骤)
pCommand->CommandType = adCmdStoredProc;
3)设置PLSQLRSet属性(如果存储过程输出参数不是记录集,忽略此步骤)
pCommand->Properties->GetItem("PLSQLRSet")->Value = true;
步骤三:设置存储过程的输入/输出参数(如果没有输入参数忽略此步骤)
1) 创建 _ParameterPtr对象并初始化_ParameterPtr pParam;
pParam.CreateInstance(__uuidof(Parameter));
2)设置_ParameterPtr对象的变量相关参数
pParam = pCommand->CreateParameter(<变量名称>,
<变量类型>,
<创建类型>,
<变量大小>);
<变量名称> : 这个名称会在取数据的时候用到
<变量类型> :变量类型可以参考以下网页:
http://school.it168.com/special/manual/ado/index.htm?url=/special/manual/ado/html/mdidxparametervcppsyntax.htm
<创建类型>:输入参数为:adParamInput 输出参数为:adParamOutput
<变量大小> :例如int为4 , 字符串为字符串的长度
例如:
pParam = pCommand->CreateParameter(_bstr_t("GAMEID"),
adInteger,
adParamInput,
4);
pParam = pCommand->CreateParameter(_bstr_t("val"),
adInteger,
adParamOutput,
4);
3)设置传入的变量值 (如果是输出参数忽略此步骤)
pParam->Value = _variant_t(< 变量值>);
< 变量值> : 要设置的数值
4)加入到Command对象的参数集属性中
pCommand->Parameters->Append(< 参数对象名>);
例如:
pCommand->Parameters->Append(pParam);
步骤四: 执行存储过程(返回记录集的情况)
1) 设置要调用的存储过程名称pCommand->CommandText = _bstr_t(<存储过程名称>(?));
<存储过程名称>:为数据库中存储过程的名称
?的个数为输入参数的个数,例如有三个输入参数,调用格式如下:
pCommand->CommandText = _bstr_t(<存储过程名称>(?,?,?));
如下图:
3) 执行调用
<记录集对象指针> =
pCommand->Execute(NULL,NULL,adCmdStoredProc | adCmdUnspecified);
例如:
m_OraDateBase.m_pTempRecord = pCommand->Execute(NULL,NULL,adCmdStoredProc | adCmdUnspecified);
步骤四: 执行存储过程(一般情况)
1) 设置要调用的存储过程名称pCommand->CommandText = _bstr_t(<存储过程名称>);
<存储过程名称>:为数据库中存储过程的名称
如下图:
例如:
pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");
2) 执行调用
pCommand->Execute(NULL,NULL,adCmdStoredProc);
步骤五:获取输出参数结果
<变量名> = pCommand->Parameters->GetItem(<输出参数名>)->GetValue();<变量名> :为C++中接收输出值的变量名
<输出参数名> :为设置输出参数时设置的变量名称
完整调用示例:
存储过程代码:create or replace procedure RP_KEYWORDS_STATISTICS
(
v_keywords varchar2
)
IS
num number;
begin
select count(*) into num from t_keywords where c_keycontent=v_keywords;
if num=0 then
insert into t_keywords select sequence_keywords.nextval,v_keywords,1 from dual;
elsif num>0 then
update t_keywords set i_num=i_num+1 where c_keycontent=v_keywords;
end if;
commit;
end RP_KEYWORDS_STATISTICS;
C++ADO调用代码:
void CExecuteSql::LogUserSearchKey(std::string strKey)
{
std::string strProcName;
_CommandPtr pCommand;
int iExpVal;
try {
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = m_OraDateBase.m_pConnection;//连接字符串
pCommand->CommandType = adCmdStoredProc;//标记该操作为存储过程
_variant_t vt;
vt.SetString("2");
_ParameterPtr pParam, pParam1;
pParam.CreateInstance(__uuidof(Parameter));
pParam = pCommand->CreateParameter(_bstr_t("keyval"),adChar,adParamInput,strKey.length());//给参数设置各属性
pParam->Value = _variant_t( strKey.c_str() );
pCommand->Parameters->Append(pParam);//加入到Command对象的参数集属性中
pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");//存储过程名
pCommand->Execute(NULL,NULL,adCmdStoredProc);
//iExpVal = pCommand->Parameters->GetItem("val")->GetValue();
} catch (_com_error e) {
CString m_strErrMsg;
m_strErrMsg.Format("LogUserSearchKey failure!\r\n\r\n message error:%s\r\n\r\n",e.ErrorMessage());
printf("%s\n", m_strErrMsg.GetBuffer());
IsDatabaseClose();
iExpVal = 0;
//shGameCoin = 0;
return ;
}
return ;
}
oracle中limit offset 怎么实现
select * from (select rownum rn,emp.* from emp) where rn between 5 and 10; ado事务处理 m_pRecordset->LockType = adLockOptimistic; m_pRecordset->CursorType = adOpenDynamic; m_pRecordset->CursorLocation = adUseServer; m_pRecordset->Open(strSource, source, adOpenDynamic, adLockOptimistic, adCmdText); m_pConnection->BeginTrans(); for(i =1; i<=5; i++) { str.Format("%d", i); m_pRecordset->AddNew(); vIndex = (short)0; m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_YOU")); vIndex = (short)1; m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_I")); vIndex = (short)2; m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_HE")); m_pRecordset->Update(); } if(MessageBox("是否完成修改?", NULL, MB_ICONQUESTION | MB_YESNO) == IDYES) { m_pConnection->CommitTrans(); } else { m_pConnection->RollbackTrans(); }
相关文章推荐
- ADO.NET 主要的三个对象(SqlConnection/SqlCommand/SqlDataReader)
- 如何正确理解和使用Command、Connection和 Recordset三个对象?
- ADO 操作数据库(二)--基本对象Connection,Command和Recordset
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- 数据库:统说ado对象游标类型(Connection,RecordSet)以及显示数据记录的三板斧
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- ADO:_ConnectionPtr,_RecordsetPtr,_CommandPtr
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- 统说ado对象游标类型(Connection,RecordSet)以及显示数据记录的三板斧
- ADO API 参考(Command 对象&Connection 对象)
- 统说ado对象游标类型(Connection,RecordSet)以及显示数据记录的三板斧
- Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介
- VC++下使用ADO操作数据库_ConnectionPtr、_RecordsetPtr和_CommandPtr(转)
- IDataEnvironment接口,ADO.Net对Connection、Command等对象的设计时支持。
- [ADO&VC一]使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- 浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法