日期:2014-05-16 浏览次数:20516 次
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();