vc下用ado调用存储过程
最近由于工作之需,要利用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();
VC操作数据库真是麻烦带气人,不过微软在.net中做的十分不错,毕竟现在VC在数据库工程中已经很少用了(除非要求很高的效率),可是对一些老程序还得更新不是。
这只是我学习的一篇笔记,有什么不对的地方请联系我。电邮:luckyfool_song@sina.com.cn
posted on 2004-06-07 22:26 LoveSong 阅读(2455) 评论(5) 编辑 收藏
评论
# re: 学习笔记之‘数据库’---VC++调用带参数的存储过程 2004-07-13 06:12 hzx
插入删除都可以了,但查询的记录怎么显示呢?
# re: 学习笔记之‘数据库’---VC++调用带参数的存储过程 2004-07-26 03:44 LOL
那你就用RECORDSETPTR啦
# re: 学习笔记之‘数据库’---VC++调用带参数的存储过程 2004-08-14 06:05 cc
m_pParam1 = m_pCommand->CreateParameter("Name",adVarChar,adParamInput,20,(_variant_t)"songwenfeng");
把"songwenfeng"换成一个字符串变量为什么不行呢?
# re: 学习笔记之‘数据库’---VC++调用带参数的存储过程 2004-12-04 00:10 王中王
写的不错
# re: 学习笔记之‘数据库’---VC++调用带参数的存储过程 2005-01-14 09:04 erewr
为什么我运行时会有下面两个错误呢~~
error C2065: “adInteger” : 未声明的标识符
error C2065: “adParamInput” : 未声明的标识符
WIN2K下的系统服务程序框架.rar_VC6_后台服务 _服务框架 c++_服务程序_系统服务
版权申诉
132 浏览量
2022-09-20
13:49:06
上传
评论
收藏 3.26MB RAR 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- 蚁群算法路径规划matlab.rar
- 基于matlab实现的PCA有监督kohonen网络的网络入侵聚类 里面包含有原代码和说明文件 .rar
- 基于matlab实现的PID神经网络前向和反向学习算法的matlab的原程序代码.rar
- 从Cadence Allegro导入至Altium Designer
- 基于matlab实现的powell优化搜索算法,适合于多参数优化且目标函数中不包含参数的情况.rar
- 基于matlab实现的powell优化算法程序 .rar
- 基于matlab实现的编程的多因子选股代码.rar
- 微信小程序 - 高仿苹果计算器源码.zip
- 通过kaggle竞赛内容,进行数据分析和数据绘图,掌握数据分析技巧
- 基于matlab实现的ELM 极限学习机的核函数 MATLAB程序,用于深入研究和改进极限学习机.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈