本站启用国内永久域名: www.LewenSky.cn,请大家使用新域名访问网站!
9月18

VC++调用ADO运行带参数的存储过程

| |
14:39MFC/VC++  From: aa211314
最近由于工作之需,要利用VC进行一些高级的数据库操作,如执行存储过程等。遍寻网络资源发现好使的不多(经常#30XX错误,大部分应该是COM的VARIANT数据类型所致,其实有个讨巧的方法,请看下文),在自己的实验下小有所得。记下学习笔记以备参考:

1 进行ADO编程的必备步骤:引入msado15.dll


#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")//避免与文件的结束符号混淆,将EOF改为adoEOF


当然要记得在所有#include之后加入啊


2 也是必备的:初始化Com库


::CoInitialize(NULL);///初始化COM库


3 建立数据库连接


_ConnectionPtr m_pConnection;//连接数据库的Com智能指针,可以自动Release ^_^
m_pConnection.CreateInstance("ADODB.Connection");//建立实例返回HRESULT 所以最好if一下看看成功否


4 连接数据库


m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);


最好用Try的,可以捕获错误啊,例如



try
{
m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);

  .........//其他数据库操作
}
catch(_com_error e)
{
  //处理错误吧
}


5 创建执行存储过程的命令对象


_CommandPtr m_pCommand;//还是智能指针
m_pCommand.CreateInstance("ADODB.Command");//实例
m_pCommand->ActiveConnection = m_pConnection;//设置连接,别忘了啊
m_pCommand->CommandText = "Test";//存储过程为Test


假设我的存储过程如下:



  CREATE PROCEDURE Test
  @id int,
  @Name varchar(20),
  @sdate datetime,
  @ret char(1) output
   AS
  insert into VCStorproc values(@id,@Name,@sdate)
  if @@error=0
   set @ret=1
  else
   set @ret=0
  go


  

6 建立传入存储过程的参数

存储过程Test中输入参数id,name,sdate 输出参数ret  记住他们的类型和大小啊

下面就来创建4个参数

VC中用_ParameterPtr智能指针来建立参数,具体如下:


_ParameterPtr m_pParam;
m_pParam.CreateInstance("ADODB.Parameter");

_ParameterPtr m_pParam1;//附加数字的命名习惯不好别学我啊
m_pParam1.CreateInstance("ADODB.Parameter");

_ParameterPtr m_pParam2;
m_pParam2.CreateInstance("ADODB.Parameter");

_ParameterPtr m_pParamRet;
m_pParamRet.CreateInstance("ADODB.Parameter");


别高兴还没有真正的建立好参数


m_pParam = m_pCommand->CreateParameter("id",adInteger,adParamInput,-1,(_variant_t)"10");//给参数设置各属性
m_pCommand->Parameters->Append(m_pParam);//加入到Command对象的参数集属性中

m_pParam1 = m_pCommand->CreateParameter("Name",adVarChar,adParamInput,20,(_variant_t)"songwenfeng");
m_pCommand->Parameters->Append(m_pParam1);

m_pParam2 = m_pCommand->CreateParameter("sdate",adVarChar,adParamInput,32,(_variant_t)"2004-6-8");
m_pCommand->Parameters->Append(m_pParam2);

//**************
  这里有个问题:就是DateTime数据类型要用adVarChar来传递,由于我们的时间格式为XXXX-XX-XX XX:XX:XX所以32位足够了,有时我们会用adDate或adDBDate类型来传递DateTime,这就是导致error #3015的原因之一,当然用它来传递应该是可以的,但是小弟至今没有成功过,哪位大虾知道告诉小弟一声啊
*******//


m_pParamRet=m_pCommand->CreateParameter("ret",adChar,adParamOutput,1);
m_pCommand->Parameters->Append(m_pParamRet);



大功告成,执行吧

引用
m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
//***
第一个参数是被影响的记录数是一个VARIANT的指针变量,需要的话设个变量取过来就是了 但是MSDN说
The RecordsAffected parameter applies only for action queries or stored procedures. RecordsAffected does not return the number of records returned by a result-returning query or stored procedure. To return this information, use the RecordCount property。就是说有返回值的存储过程是不会返回影响的记录数的,要使用RecordCount属性

第二个参数是指向Parameters的VARIANT指针,是可选的,既然设置好了参数指针就把它设为NULL吧。MSDN说
A Variant array of parameter values passed with an SQL statement. (Output parameters will not return correct values when passed in this argument.)用这个参数的话输出参数将不会返回正确的值。微软是不是挺有意思
*************//



数据库里已经有了一条新记录了,看看

id name  sdate
10 songwenfeng 2004-6-8

7 最后一步,关闭连接,释放Com,走人!!


m_pConnection->Close();
CoUninitialize();


出处:aa211314
转载时必须以链接形式注明出处及本声明!


最新日志 随机日志 综合排行
  • OFFICE 2010 VOL...
  • 格式工厂绿色版 V2.90
  • Password Invent...
  • VideoCacheView ...
  • 电脑店U盘启动盘制作工具 3....
  • 阿里旺旺AliIM2011_7...
  • 极点五笔十周年纪念版
  • PPTV网络电视3.1.1.0...
  • WinRAR注册方法
  • 紫光华宇拼音输入法 6.8.0...
  • [二次修正]Screen2EX...
  • 迅雷 v5.9.23.1488...
  • 暴风影音2012 3.10.0...
  • PotPlayer 1.5.2...
  • 驱动精灵2011 V5.4.4...
  • FileTypesMan 1....
  • Microsoft Offic...
  • QQ音乐2011(2050)绿...
  • Microsoft offic...
  • Windows 7 截至 20...
  • 安装软件时出现系统提示&quo...
  • XP与XP无线共享设置(笔记本...
  • ZineMaker目录模板大集...
  • 没有不可能 轻松实现PDG转P...
  • CString转char的方法...
  • [转]MSDN精简版、MSDN...
  • 将IE、FIREFOR (火狐...
  • VC多线程编程(转)
  • MyEclipse6.5下载地...
  • Diskeeper 2010 ...
  • Tags: , , ,
    阅读(3542) | 评论(0) | 引用(0)
    发表评论
    表情
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    打开HTML
    打开UBB
    打开表情
    隐藏
    记住我
    昵称   密码   游客无需密码
    网址   电邮   [注册]