




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC调用存储过程的通用方法(SQLServer篇)开发者在线 B 更新时间:2008-03-28作者:临风 来源:CSDN本文关键词: sqlserver 调用 vc 数据库 这里讨论的是ADO调用存储过程,按MSDN的例子,一般都是下面的调用方法(节选自MSDN):HRESULT hr = S_OK; / Define ADO object pointers. / Initialize pointers on define. / These are in the ADODB: namespace. _RecordsetPtr pRstByRoyalty = NULL; _RecordsetPtr pRstAuthors = NULL; _CommandPtr pcmdByRoyalty = NULL; _ParameterPtr pprmByRoyalty = NULL; _ConnectionPtr pConnection = NULL; _bstr_t strCnn(Provider=sqloledb;Data Source=srv; Initial Catalog=Pubs;User Id=sa;Password=;); _bstr_t strMessage, strAuthorID; int intRoyalty; VARIANT vtRoyalty; try /Open a Connection. TESTHR(pConnection.CreateInstance(_uuidof(Connection); hr = pConnection-Open(strCnn,NULL); pConnection-CursorLocation = adUseClient; /Open Command Object with one Parameter TESTHR(pcmdByRoyalty.CreateInstance(_uuidof(Command); pcmdByRoyalty-CommandText = byroyalty; pcmdByRoyalty-CommandType = adCmdStoredProc; /Define Integer/variant. vtRoyalty.vt = VT_I2; vtRoyalty.iVal = intRoyalty; pprmByRoyalty = pcmdByRoyalty-CreateParameter( percentage,adInteger,adParamInput,sizeof(int),vtRoyalty); pcmdByRoyalty-Parameters-Append(pprmByRoyalty); pprmByRoyalty-Value = vtRoyalty; /Create Recordset by executing the command pcmdByRoyalty-ActiveConnection = pConnection; pRstByRoyalty = pcmdByRoyalty-Execute( NULL,NULL,adCmdStoredProc); /执行结果的处理,省略. pRstByRoyalty-Close(); pRstAuthors-Close(); pConnection-Close(); catch(_com_error &e) /意外处理. 必须指定执行SQL语句的CommandType是adCmdStoredProc,存储过程有参数就必须CreateParameter生成参数,这样调用存储过程就成了很麻烦的一件事情,必须针对不同的存储过程生成不同的参数。一个两个还可以接受,如果项目的业务逻辑比较复杂,需要依赖大量的存储过程,并且项目的需求或功能可能要经常变动或扩展,那就成了一个噩梦了。有没有通用的方法呢?当然有,只需要通用的查询就可以实现。_ConnectionPtr pConnection = NULL;m_Conn.CreateInstance(_uuidof(Connection);m_Conn-ConnectionString = Provider=sqloledb;Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=;m_Conn-Open(,NULL);_variant_t m_param;_bstr_t m_bstr;int index = 0,nFieldCount;_RecordsetPtr m_Rs;m_Rs.CreateInstance(_uuidof(Recordset);m_Rs-Open(select * from titles,(IDispatch*)(m_Conn-m_Conn),adOpenStatic,adLockReadOnly,adCmdText);nFieldCount = m_Rs-Fields-Count;while(!m_Rs-EndOfFile) for(index=0;index Fields-GetItem(m_param); if(m_param.vt != VT_NULL) m_bstr = m_param; else m_bstr = ; printf(%sn,(char*)m_bstr); m_Rs-MoveNext();m_Rs-Close();m_Conn-Close();以上一段就是普通的执行查询SQL语句的代码,简单起见,去掉了所有防护和判断代码,对于MS SQLServer,如果是执行返回结果集的存储过程,比如Pubs的byroyalty,只需要把上面代码中的select * from titles替换成byroyalty 100就可以了,即过程名 参数1,参数2,.形式。这样一来,不需要生成参数,只需要改变SQL语句,就实现了MS SQLServer存储过程的调用,可以通用。但是对于返回参数的存储过程,这段代码就不行了,不过还是可以通过SQL语句解决:“declare q int exec checkpwd user,pwd,ret = q OUTPUT select q”checkpwd是一个存储过程,两个输入参数,用户名和密码,第三个是输出参数ret,返回用户验证的结果。通过执行上面的SQL语句,把输出参数作为结果集返回,就可以适应上面的VC代码了。返回值的存储过程也是一样,执行“declare q int,return intexec return = checkpwd user,pwd,ret = q OUTPUT select q,return”就可以了。这里讲的是SQLServer的存储过程调用,这段代码同样可以调用ORACLE的存储过程,不过需要对SQL语句作出一些调整,留待下一篇再说了。VC调用存储过程的通用方法(ORACLE篇)开发者在线 B 更新时间:2008-03-28作者:临风 来源:CSDN本文关键词: 存储 调用 vc 数据库 先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果集,需要进行遍历:long lngRec = 0;_RecordsetPtr Rs = m_Rs; /m_Rs为调用存储过程返回的结果集while(Rs) /结果集的处理,有无数据的判断,数据处理等while(!m_Rs-EndOfFile) /. Rs = Rs-NextRecordset(VARIANT *)lngRec);调用ORACLE的存储过程,VC的调用代码不需要变动,但需要对ORACLE的存储过程和调用的SQL语句进行一些调整。首先,连接字符串不能用ODBC,即连接字符串不能是Driver=Microsoft ODBC for Oracle;Server=OracleServer.world;Uid=Username;Pwd=asdasd; 这种形式,而应该是类似:Provider=MSDAORA.1;Password=asdasd;User ID=Username;Data Source=world;Persist Security Info=True然后是存储过程的调整,ORACLE存储过程怎么返回结果集网上的文章已经很多了,需要用到包,随便摘录一个:CREATE OR REPLACE PACKAGE pkg_testAS TYPE myrctype IS REF CURSOR; PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);END pkg_test;/ CREATE OR REPLACE PACKAGE BODY pkg_testAS PROCEDURE get (p_id NUMBER, p_rc OUT myrctype) IS sqlstr VARCHAR2 (500); BEGIN IF p_id = 0 THEN OPEN p_rc FOR SELECT ID, NAME, sex, address, postcode, birthday FROM student; ELSE sqlstr := select id,name,sex,address,postcode,birthday from student where id=:w_id; OPEN p_rc FOR sqlstr USING p_id; END IF; END get;END pkg_test;/其实不用包也可以,直接创建get,只需要把最后一个参数p_rc的类型改为sys_refcursor就可以了。最后是SQL语句的调整,SQLServer是直接get 0就可以,ORACLE必须这样调用:call get(0)即执行:m_Rs-Open(call get(0),(IDi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省漳州市2026届高三第一次教学质量检测数学试题(含答案)
- 幼师论文题目及答案
- 2025年食品、饮料及烟草批发服务项目建议书
- 教师老师试题及答案
- 公务员制度自考试题及答案
- 抗原检测生物安全培训课件
- 扩展语句压缩语段课件
- 慢性胃炎的护理
- 2025年机械技能考试题目及答案
- 山东高职考试数学试题及答案
- JB∕T 5245.4-2017 台式钻床 第4部分:技术条件
- 鞘膜积液的护理查房
- 语言学纲要(新)课件
- 针灸治疗神经性耳鸣耳聋课件
- 《水工监测工》习题集最新测试题含答案
- φ108管棚施工作业指导书
- 脑卒中的功能锻炼课件
- 部编版三年级上册道德与法治第一单元第1课《学习伴我成长》课件
- 倪海厦X年扶阳论坛演讲
- 《一站到底》最全的题库
- 现场临电方案改
评论
0/150
提交评论