c++通过ADO对数据库操作

C/C++ 通过ADO对数据库操作

实例:c++ 通过ADO调用存储过程写入数据到sql server

1.在.h头文件导入微软提供的ado的动态库

#pragma warning(disable:4146)

#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")

#pragma warning(default:4146)

using namespace ADODB;

2.编写函数调用存储过程

//保存数据库记录

void SaveDbTran(char *devID,char * traceNo,char *refNo,char *batchNo, char * bankCardNo, char * tranDate, char * tranTime,char * amt,char * hosCardNo,char * hosName,char * hosIDCardNo, char *msg)

{

//2.1创建数据库连接句柄

_ConnectionPtr pMyConnect;

HRESULT hr;

try

{

//2.1.1组建连接数据库字符串

char *dbConStr = new char[400];

strcpy(dbConStr,"Provider=SQLOLEDB;Server=sqlserver服务器地址,1433;Database=数据库名;uid=登陆用户;pwd=登录密码");

CoInitialize(NULL);

Sleep(300);

//2.1.2 句柄实例化 实现连接

hr = pMyConnect.CreateInstance("ADODB.Connection");

if(SUCCEEDED(hr))

{

ct.SaveLog("创建数据库连接对象成功,等待打开连接",0,dbConStr);

pMyConnect->Open(_bstr_t(dbConStr),"","",adModeUnknown);

}

else

{

CoUninitialize();

return;

}

}

catch(_com_error &err)

{

CoUninitialize();

return ;

}

//2.2组建运行命令参数句柄

_CommandPtr   m_pCommand;

_RecordsetPtr m_pRecordset;

try

{

//2.2.1 句柄实例化

m_pCommand.CreateInstance(__uuidof(Command));//Command无需改变

m_pCommand->ActiveConnection = pMyConnect;//pMyConnect 为连接数据库句柄

m_pCommand->CommandType = adCmdStoredProc;//adCmdStoredProc无需改变

m_pCommand->CommandText = _bstr_t("p_d_tra");//p_d_tra为存储过程名

//2.2.2 设置给可变参数赋值

_variant_t  vv_dotype,vv_TranNo,vv_devID,vv_TranDate,vv_TranTime;

_variant_t  vv_RetCode,vv_BusType,vv_CardNo,vv_IDCard,vv_Name;

_variant_t  vv_Amt,vv_Notes,vv_SerID,vv_DesCont,vv_tranFlag;

_variant_t  vv_bankCardNo,vv_bankGroupNo,vv_bankFlowNo,vv_DevName,vv_ExeCount;

// value to variant

vv_dotype     =_variant_t(_bstr_t("1"));

vv_TranNo     =_variant_t(_bstr_t(temp_traceNo));

vv_devID      =_variant_t(_bstr_t(devID));

vv_TranDate   =_variant_t(_bstr_t(datetime));

vv_TranTime   =_variant_t(_bstr_t(datetime));

vv_RetCode    =_variant_t(_bstr_t(""));

vv_BusType    =_variant_t(_bstr_t("14"));

vv_CardNo     =_variant_t(_bstr_t(hosCardNo));

vv_IDCard     =_variant_t(_bstr_t(hosIDCardNo));

vv_Name       =     _variant_t(_bstr_t(hosName));

vv_Amt        =_variant_t(_bstr_t(amt));

vv_Notes      =_variant_t(_bstr_t("交易成功"));

vv_SerID  =_variant_t(_bstr_t(""));

vv_DesCont    =_variant_t(_bstr_t(""));

vv_tranFlag   =_variant_t(_bstr_t("0"));

vv_bankCardNo =_variant_t(_bstr_t(temp_bankCardNo));

vv_bankGroupNo=_variant_t(_bstr_t(batchNo));

vv_bankFlowNo =_variant_t(_bstr_t(refNo));

vv_DevName    =_variant_t(_bstr_t(""));

vv_ExeCount   =     _variant_t(ret_ExeCount);

//2.2.3创建数据库存储过程输入参数

_ParameterPtr mp_dotype,mp_TranNo,mp_devID,mp_TranDate,mp_TranTime;

_ParameterPtr mp_RetCode,mp_BusType,mp_CardNo,mp_IDCard,mp_Name;

_ParameterPtr mp_Amt,mp_Notes,mp_SerID,mp_DesCont,mp_tranFlag;

_ParameterPtr mp_bankCardNo,mp_bankGroupNo,mp_bankFlowNo,mp_DevName,mp_ExeCount;

//2.2.3.1给数据库参数实例化

//create ParameterPtr instance

mp_dotype.CreateInstance(__uuidof(Parameter));

mp_TranNo.CreateInstance(__uuidof(Parameter));

mp_devID.CreateInstance(__uuidof(Parameter));

mp_TranDate.CreateInstance(__uuidof(Parameter));

mp_TranTime.CreateInstance(__uuidof(Parameter));

mp_RetCode.CreateInstance(__uuidof(Parameter));

mp_BusType.CreateInstance(__uuidof(Parameter));

mp_CardNo.CreateInstance(__uuidof(Parameter));

mp_IDCard.CreateInstance(__uuidof(Parameter));

mp_Name.CreateInstance(__uuidof(Parameter));

mp_Amt.CreateInstance(__uuidof(Parameter));

mp_Notes.CreateInstance(__uuidof(Parameter));

mp_SerID.CreateInstance(__uuidof(Parameter));

mp_DesCont.CreateInstance(__uuidof(Parameter));

mp_tranFlag.CreateInstance(__uuidof(Parameter));

mp_bankCardNo.CreateInstance(__uuidof(Parameter));

mp_bankGroupNo.CreateInstance(__uuidof(Parameter));

mp_bankFlowNo.CreateInstance(__uuidof(Parameter));

mp_DevName.CreateInstance(__uuidof(Parameter));

mp_ExeCount.CreateInstance(__uuidof(Parameter));

//2.2.3.2将数据库参数追加到 命令变量句柄的参数属性末尾

//append parameterPtr set  to _CommandPtr parameters lists

//数据库参数 =  命令变量句柄->创建参数方法(_bstr_t("存储过程参数名"),存储过程参数数据类型,存储过程参数输入输出类型,默认大小,可变参数值)

mp_dotype=m_pCommand->CreateParameter(_bstr_t("dotype"),adInteger,adParamInput,-1,vv_dotype);//整数类型

m_pCommand->Parameters->Append(mp_dotype);

mp_TranNo=m_pCommand->CreateParameter(_bstr_t("TranNo"),adVarChar,adParamInput,32,vv_TranNo); //字符串类型

m_pCommand->Parameters->Append(mp_TranNo);

mp_devID=m_pCommand->CreateParameter(_bstr_t("devID"),adVarChar,adParamInput,20,vv_devID);

m_pCommand->Parameters->Append(mp_devID);

mp_TranDate=m_pCommand->CreateParameter(_bstr_t("TranDate"),adVarChar,adParamInput,25,vv_TranDate);//时间类型

m_pCommand->Parameters->Append(mp_TranDate);

mp_TranTime=m_pCommand->CreateParameter(_bstr_t("TranTime"),adVarChar,adParamInput,25,vv_TranTime);

m_pCommand->Parameters->Append(mp_TranTime);

mp_RetCode=m_pCommand->CreateParameter(_bstr_t("RetCode"),adVarChar,adParamInput,20,vv_RetCode);

m_pCommand->Parameters->Append(mp_RetCode);

mp_BusType=m_pCommand->CreateParameter(_bstr_t("BusType"),adInteger,adParamInput,-1,vv_BusType);

m_pCommand->Parameters->Append(mp_BusType);

mp_CardNo=m_pCommand->CreateParameter(_bstr_t("CardNo"),adVarChar,adParamInput,20,vv_CardNo);

m_pCommand->Parameters->Append(mp_CardNo);

mp_IDCard=m_pCommand->CreateParameter(_bstr_t("IDCard"),adVarChar,adParamInput,20,vv_IDCard);

m_pCommand->Parameters->Append(mp_IDCard);

mp_Name=m_pCommand->CreateParameter(_bstr_t("Name"),adVarChar,adParamInput,10,vv_Name);

m_pCommand->Parameters->Append(mp_Name);

mp_Amt=m_pCommand->CreateParameter(_bstr_t("Amt"),adDecimal,adParamInput,10,vv_Amt);//浮点数类型

mp_Amt->NumericScale = 2;  //设置小数点后位数

mp_Amt->Precision = 10;    //设置整数位位数

m_pCommand->Parameters->Append(mp_Amt);

mp_Notes=m_pCommand->CreateParameter(_bstr_t("Notes"),adVarChar,adParamInput,2000,vv_Notes);

m_pCommand->Parameters->Append(mp_Notes);

mp_SerID=m_pCommand->CreateParameter(_bstr_t("SerID"),adVarChar,adParamInput,20,vv_SerID);

m_pCommand->Parameters->Append(mp_SerID);

mp_DesCont=m_pCommand->CreateParameter(_bstr_t("DesCont"),adVarChar,adParamInput,2000,vv_DesCont);

m_pCommand->Parameters->Append(mp_DesCont);

mp_tranFlag=m_pCommand->CreateParameter(_bstr_t("tranFlag"),adInteger,adParamInput,-1,vv_tranFlag);

m_pCommand->Parameters->Append(mp_tranFlag);

mp_bankCardNo=m_pCommand->CreateParameter(_bstr_t("bankCardNo"),adVarChar,adParamInput,25,vv_bankCardNo);

m_pCommand->Parameters->Append(mp_bankCardNo);

mp_bankGroupNo=m_pCommand->CreateParameter(_bstr_t("bankGroupNo"),adVarChar,adParamInput,12,vv_bankGroupNo);

m_pCommand->Parameters->Append(mp_bankGroupNo);

mp_bankFlowNo=m_pCommand->CreateParameter(_bstr_t("bankFlowNo"),adVarChar,adParamInput,12,vv_bankFlowNo);

m_pCommand->Parameters->Append(mp_bankFlowNo);

mp_DevName=m_pCommand->CreateParameter(_bstr_t("DevName"),adVarChar,adParamInput,40,vv_DevName);

m_pCommand->Parameters->Append(mp_DevName);

mp_ExeCount=m_pCommand->CreateParameter(_bstr_t("ExeCount"),adInteger,adParamOutput,-1,vv_ExeCount);//输出类型

m_pCommand->Parameters->Append(mp_ExeCount);

//2.2.4 执行得到结果

_variant_t vNull;

vNull.vt = VT_ERROR;

vNull.scode = DISP_E_PARAMNOTFOUND;

//2.2.4.1执行数据库存储过程

m_pRecordset = m_pCommand->Execute(&vNull,&vNull,adCmdStoredProc);//adCmdStoredProc不要改变

//m_pRecordset执行SQL结果 可对其进行判断确定成功,错误原因

if (mp_ExeCount->Value != 0)

{

ct.SaveLog("插入数据失败",0,"");

}

else

{

ct.SaveLog("插入数据成功",0,"");

}

}

catch(_com_error &err)

{

if(pMyConnect->State) pMyConnect->Close();

pMyConnect = NULL;

CoUninitialize();

}

//2.2.5 关闭连接 释放资源

if(pMyConnect->State) pMyConnect->Close();

pMyConnect = NULL;

CoUninitialize();  //切记成功与否都要调用 以释放资源

return ;

}

时间: 2024-10-23 07:05:19

c++通过ADO对数据库操作的相关文章

MFC中使用ADO进行数据库操作

参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等. 数据库编程是对数据库的创建.读写等一列的操作.数据库编程分

ADO.NET 数据库操作类

操作数据类 避免代码重用.造对象太多.不能分工开发 利用面向对象的方法,把数据访问的方式优化一下,利用封装类   一般封装成三个类: 1.数据连接类 提供数据连接对象 需要引用命名空间: using System.Data.SqlClient; 例: public class DBConnect { private static string connstring = "server=.;database=mydb;user=sa;pwd=123"; public static Sql

C# ADO.NET数据库操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Med

VB语言使用ADO连接、操作SQLServer数据库教程

VB语言使用ADO连接.操作SQLServer数据库教程 这篇文章主要介绍了VB语言使用ADO连接.操作SQLServer数据库教程,本文讲解详细.代码中有大量注释,是非常好的一篇教程,需要的朋友可以参考下 几年前学过的VB几乎忘光了,这几天复习了下.VB连接ADO数据库并不是非常难. 连接第一步(要仔细看) 对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件. 在Micr

ADO.NET之断开数据连接的数据库操作

在ADO.NET对数据库操作时有两种方式一种时与数据库实时连接,第二种时断开连接的操作. 断开连接的操作使用SqlDataAdapter来实现,我们要把数据库中的表数据加载到winform中的datagridview控件中时,使用断开连接来实现,以下是代码实现: string server = "Data Source=.;Initial Catalog=MyDataBase;Integrated Security=True"; string sql = "select *f

MFC ADO数据库操作

MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现有的ado数据库操作函数方法进行汇总. 小函数m_pRecordset->RecordCount//取得记录数量 全局变量#import "msado15.dll" no_namespace rename("EOF","adoEOF")rena

数据库操作(ADO)

QTP工具本身自带有数据查询和验证功能,但是使用的人会感觉这个功能使用起来比较麻烦,灵活性和复用性较低,于是我们选择了用脚本调用ADO组件实现数据库的操作,现总结下工作中用到的数据库操作,代码如下: 一.最常用的数据库取值操作 ‘获取数据库查询语句 sql="select * from user where name='wangwei'" '获取数据库连接字符 strconn="Driver={microsoft odbc for oracle};server=ORACS17

ado.net的简单数据库操作(一)

摘要:接下来的几篇博客将要讲到如何使用ado.net实现简单的数据库操作,包括增删改等内容.首先会介绍基础的数据库操作,然后以一个实例来进行讲解,这个实例会把一个数据表读取到winform上,然后在winform上有一些按钮和文本框,通过这些实现对数据库里的内容的增删改的操作.我个人比较菜,因此记录计较详细,说话也啰嗦,因此可能会写几篇才能介绍完. 本人属菜鸟一枚,刚接触.net两个星期,写的东西也是照搬自己看的视频里老师教的东西,其目的主要是为了巩固自己学习,当然,如果正好能帮助到和我一样的刚

一种利用ADO连接池操作MySQL的解决方案(VC++)

VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连接永远不关闭,直接数进程退出),但是这样做至少会引起两个问题:(1)资源竞争,多个数据库请求操作不能同时进行,后一请求必须要等到前一请求完成后才能进行:(2)多线程情况下容易出现混乱,甚至出现资源异常释放.还有一种方法,就是使用数据库时创建连接,使用完后关闭连接回收资源.这种方式在数据库操作频繁的情