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中最重要的对象有三个:Connection、Recordset和Command的更多相关文章

  1. 第二章python中的一切皆对象

    1.函数和类也是对象,属于python的一等公民 赋值给一个变量 可以添加到集合对象之中 可以作为参数传递给函数 可以当作函数的返回值 def ask(name="ask_wzh" ...

  2. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  3. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  4. Hibernate中对象的三个状态解析

    Hibernate 将操作的对象分为三种状态: 1. 瞬时 (Transient )/临时状态/自由状态 持久 (Persistent) 脱管 (Detached) 瞬时对象特征: 第一.不处于 Se ...

  5. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  6. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  7. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  8. c++中经常需要访问对象中的成员的三种方式

    可以有3种方法: 通过对象名和成员运算符访问对象中的成员; 通过指向对象的指针访问对象中的成员; 通过对象的引用变量访问对象中的成员. 一.通过对象名和成员运算符访问对象中的成员 例如在程序中可以写出 ...

  9. Java中对象的三种状态

    Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可达状态. 状态二:可复活态:从根节点开 ...

随机推荐

  1. 读写锁ReadWriteLock

    为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率. Java中读写锁有个接口java.util ...

  2. java 可设置最大内存

    测试方法:在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息. 堆(Heap)和非堆(N ...

  3. Idea使用Maven创建Java Web项目

    最近学到了Java Web项目,使用Idea和Maven创建Java Web的时候遇到了诸多问题,最多的还是404问题.现在记录一下解决方案. 一.使用maven创建一个web项目,这一步网上都有,下 ...

  4. 正则表达式基于JavaScript的入门详解

    关于正则表达式,和很多前辈聊起这个知识点时,他们的反馈都比聊其他技术谦逊,而和很多刚入门的程序员讨论时甚至会有觉得你看不起他. 的确,正则表达式从通常的应用来看,的确不难,比如电话,邮箱等验证.语法, ...

  5. Chrome刷新缓存

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键  Ctrl+Shift+R  重新加载当前网页而不使用缓存内容

  6. Asp.net+WebSocket+Emgucv实时人脸识别

    上个月在网上看到一个用web实现简单AR效果的文章,然后自己一路折腾,最后折腾出来一个 Asp.net+WebSocket+Emgucv实时人脸识别的东西,网上也有不少相关资料,有用winform的也 ...

  7. java位运算(&、|、 ~、>>、>>> 、 ^)

    1.& 与 数字按位进行与运算 101101 110111 100101 2.| 或 数字按位进行或运算 3.~ 非 数字按位取反 4.>> 右移 数字按位进行右移 正数右移高位补 ...

  8. Kettle系列: 马进举开源的Kettle通用插件 KettleEasyExpand

    扩展Kettle功能, 经常使用 user defined java class 组件, 或者自己开发Java插件. 两种方式都有各自的痛点: 1. 在user defined java class ...

  9. SQL Server进阶(十一)临时表、表变量

    临时表 本地临时表 适合开销昂贵   结果集是个非常小的集合 -- Local Temporary Tables IF OBJECT_ID('tempdb.dbo.#MyOrderTotalsByYe ...

  10. Android上禁止屏幕旋转

    看网上讲了很多,设置很多属性,设置了很多,其实最关键的一点是这个 @Overrideprotected void onResume() { /** * 设置为横屏 */ if(getRequested ...