日期:2014-05-16  浏览次数:20516 次

数据库 ADO 另一种使用方法和关于C++引用的两个小点【2013.10.16 小记】

2013.10.16 小记

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

1.发现有的朋友用ADO msado**.dll的时候基本都只会拼接SQL的写入,修改数据库的方法。

其实ADO是能够做到不用拼接SQL的...以应对事务提交,数据库回滚等操作。当写入/修改的数据庞大需要多次写入的时候,其修改/写入的速度是拼接SQL的N倍

在这里就简单说一下写入数据的方法,修改的方法也雷同。


首先 连接数据库 创建连接对象

_ConnectionPtr pCon;//具体连接方法就不多说了...和拼接sql的方法一样。

然后声明并创建一个记录集对象

_RecordsetPtr pRecord;//创建也不多说了。CreateInstance

设置游标对象为adUseClient
pRecord->put_CursorLocation(adUseClient);


然后根据你想输入的表打开记录集(这里有几种方法打开表记录集,有selece * from tabname 的方法 和 只需提供表明的方法)
pRecord->Open(_variant_t(“selece * from tabname”),_variant_t((IDispatch*)pConn,true),adOpenDynamic,adLockOptimistic ,adCmdText);  //最后一个参数adCmdText
pRecord->Open(_variant_t(“tabname”),_variant_t((IDispatch*)pConn,true),adOpenDynamic,adLockOptimistic ,adCmdTable);  //最后一个参数adCmdTable

可以看到根据参数不同,可以实现同样的功能打开记录集。附录最后一个参数

CommandTypeEnum
{
    adCmdUnspecified = -1,
    adCmdUnknown = 8,
    adCmdText = 1,
    adCmdTable = 2,
    adCmdStoredProc = 4,
    adCmdFile = 256,
    adCmdTableDirect = 512
};


好了继续说写数据,现在已经打开了表记录集,本方法一般需要使用到事务提交的方法,所以先开始一个事务。

m_pConnection->BeginTrans();

下一步就是关键的增加数据了,新增一行数据AddNew:
recordset->AddNew();

然后就可以根据你的字段名赋值了...

recordset->PutCollect("id",_variant_t("iddata"));

.....

最后一步更新写入到记录集,这里还只是到记录集,还没到数据库里面哦。
recordset->Update();  //这样就完成了更新一条到记录集。

然后从这里重复AddNew的步骤,至更新完全部数据到记录集,最后提交到数据库:
m_pConnection->CommitTrans();

成功的话,就完事OK啦,如果失败的话可以回滚事务:
m_pConnection->RollbackTrans();


好了,添加数据的方法就说完啦。

至于修改数据更新数据库嘛,开始事务后,就不用AddNew一条记录,直接修改记录集(逐条逐字段修改赋值即可):
recordset->PutCollect("id",_variant_t("iddata"));

然后移动到下一条记录:

pRecordset->MoveNext();

最后提交事务,失败回滚。。。


2.一个C++ 引用的点,关于编译器优化的...代码如下:


int itmp = 10;

const int &iq1 = itmp;

const int &iq2 = itmp + 10;

cout <<itmp << endl;

cout <<iq1<<endl;

cout <<iq2<<endl;


先不要想如何输出, 先想一下既然是引用,很显然iq1引用的是itmp的。那么iq2是引用的什么呢?一个不itmp ?还是什么?

嘿嘿....

答案就是 iq2 引用的是一个编译器优化的临时变量。

相当于:

const int &iq1 = itemp;

int itmp2 = item + 10;

const int &iq2 = itmp2;

。。。。。。。。。。。。懂了吧。


3.在加一点,关于引用的点。先上代码

int g_int;

int func()

{

return g_int;

}

void main()

{

int itmp = func();//这个大家应该都没有异议吧!

int &iq = func();//这个呢、? 编译的时候你就会发现无法编译成功了,为什么呢?

}

为什么?难道iq不是g_int的引用么?

其实func返回的是一个临时变量,一个=g_int的临时变量,func调用结束的时候,这个临时变量的生存周期就结束了...

那么,iq引用一个生成周期结束了的临时变量,自然就是非法的啦,所以无法编译过啦...是吧。

解决方法:声明函数

int &func();