c++ ado连接mysql数据库_C++使用ADO连接数据库及其实例
读写数据库的技术很多,现在多用ADO。ADO以COM方式提供,所以它的很多行为遵循COM规范。首先,要引入ADO的COM文件,它的位置一般在"C:/Program Files/Common Files/System/ado/msado15.dll"。
1.引入ADO
打开预编译头文件StdAfx.h,写上引入声明:
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
解释一下上句:no_namespace是指忽略命名空间,rename则是把ADO中的EOF重命名为adoEOF。命成什么名字无所谓,但注意声明中的名字要和代码中的名字一致。
2.初始化
用ADO写代码前,要将COM初始化。常用手段是在代码前后加上CoInitialize(NULL)和CoUninitialize()。也可以用AfxOleInit()来初始化COM库。
3.三个核心对象
ADO的3个核心对象是连接对象(_Connection)、命令对象(_Command)和记录集对象(_RecordSet)。其中连接对象是任何操作必须的。很多操作3个核心对象都可以完成。要实例化它们并使用它们提供的方法,不得不说到它们是一种智能指针(Smart Pointer)。在初始化或释放等操作时,它们是一个对象,用点操作符,其他大部分操作则使用“->”操作符。
4.实例化
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRec(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));
如果上面不加参数,则需加上:
pConn.CreateInstance("ADODB.Connection");
pRec.CreateInstance("ADODB.Recordset");
pCmd.CreateInstance("ADODB.Command");
5.连接数据库
连接数据库一般采取字符串连接。这个字符串的获取方法用了“不能说的秘密”,即任意新建一个txt文件,重命名为.x.udl。然后双击此文件,将出现“数据库连接属性”窗口。第一个标签页“提供程序”列出了所有数据库引擎,Access, SQL Server, Oracle等,选择后点下一步跳至第二个标签页“连接”,选择服务器名称栏可以填上服务器的IP地址,本机则可不填或填点号;填上数据库用户名和密码后就可以选择数据库了。点“测试连接”按钮,成功。确定。用记事本打开x.udl。将会看到它生成的连接字符串。如下:
"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=cfdata"
此连接串中,Persist Security Info属性为True时表示在建立连接后仍然保存密码,一般取False即可。ID和Password属性只有在上述数据库属性对话框中勾选“允许保存密码”时才会有。自己可以手工添加。Cfdata是我的数据库名。
C++中连接代码如下:
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=cfdata";
6.示例
有些数据库操作_Connection一个就能完全搞定。如update语句。因为它不需要返回的结果。如下:
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=cfdata";
pConn->Open("","","",adConnectUnspecified); //打开连接。此处参数均已在上述字符串声明,故可为空
CString strSQL="update table1 set name=’Richard’ where id=1";
_pConn->Execute(_bstr_t(strSQL),NULL,adCmdText);
这里涉及强制类型转换。COM中的数据类型和常规(如MFC)类型一般都有对应,但需要转换。如上面的_bstr_t和CString。至于应该转换成什么类型,看VC环境中的提示即可(这里推荐大家加装Visual Assitant,使提示功能更完善)。
也有些操作需要返回记录集,如select语句。这里就至少需要_Connection和_Recordset两种核心对象,也可以用_Command执行之。下面展示同一操作用3种对象分别实现的代码。
(1)连接对象
CString strSQL="select * from table1"; //方法1
pRec=pConn->Execute(_bstr_t(strSQL),NULL,adCmdText);
(2)记录集对象
CString strSQL="select * from table1"; //方法2
pRec->Open(_variant_t(strSQL),(_variant_t)( (IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText);
其中第二个参数(_variant_t)( (IDispatch*)pConn)指明活动连接,数据类型转换比较复杂,_variant_t是参数要求的类型,IDispath*则是_variant_t可强制转换类型类型。也可用下句:
pConnGetInterfacePtr();
(3) 命令对象
CString strSQL="select * from table1"; //方法3
pCmd->put_ActiveConnection((_variant_t)((IDispatch*)pConn));
pCmd->CommandText=_bstr_t(strSQL);
pRec=pCmd->Execute(NULL,NULL,adCmdText);
7.数据使用
取得记录集后,将其中数据取出。用一个ListBox读取其中name字段数据。代码如下:
while(!pRec->adoEOF)
{
//_bstr_t类型可以视作COM类型字符串和MFC类型字符串之间的桥梁
CString str=LPSTR(_bstr_t(pRec->GetCollect("name")));
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(str);
pRec->MoveNext();
}
上述代码中用到了adoEOF,要注意直接拷贝第三方代码时可能会被重命名为rsEOF等,此时则需作相应更改。另外,while循环中的MoveNext()也不要忘了,否则它就成了死循环了。字段值的获取及转换也可用下面方法:
_variant_t var=pRec->GetCollect("name");
var.ChangeType(VT_BSTR);
CString str=var.bstrVal;
8.关闭与释放
用完相应对象后,需要关闭并释放之,代码如下:
pRec->Close();
pConn->Close();
pRec.Release();
pCmd.Release();
pConn.Release();
9.错误捕获
数据库操作难免出现错误,连接串错误,SQL语句错误,或返回NULL你却硬要向表里塞(此错误可以在取出后用var.vt!=VT_NULL判断),所以我们需要把它们放到try…catch段中。ADO在捕获到错误后会抛出_com_error类型异常,我们可以这样做:
try
{
pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=cfdata";
pConn->Open("","","",adConnectUnspecified);
………… //代码省略
}
catch(_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
AfxMessageBox(e.Description());
}
这里有个疑惑,在捕获错误后,e.ErrorMessage()和e.Description()中放着不同信息,有时前者说得清晰,有的后者说的清晰,搞不清楚,索性就都加上吧。最后,可以再加个catch(…),毕竟ADO之外的地方也可能发生错误。
这里,我还犯过一个错误,被它整了N久。我把_com_error& e写成了_com_error* e后面也对应改成->操作符,而且编译通过,结果一运行程序就崩溃,而且它不告诉我在哪出错,因为这时的错误是_com_error这时却对着_com_error*来捕获当然捕不到。这里&只是一个引用,写不写无所谓,*是万万不可地。(网上书上很多大师级代码都是用了*,误导啊)。
10.其他接口
ADO中除了3个核心对象外,我们还应了解FieldsPtr、FieldPtr、StreamPtr等接口。例如上述示例中,我们可以用FieldsPtr的GetCount()方法获取其字段个数,用FieldPtr来接收具体字段等。二进制数据如图像文件等则会用到StreamPtr。
实例代码:
#include
#include "vector"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
using namespace std;
int main(int argc, char* argv[])
{
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRec(__uuidof(Recordset));
或者采用以下方式:
//_ConnectionPtr pConn=NULL;
//_RecordsetPtr pRec=NULL;
//_CommandPtr pCmd=NULL;
//pConn->CreateInstance("ADODB.Connection");
//pRec->CreateInstance("ADODB.Recordset");
//pCmd->CreateInstance("ADODB.Command");
try
{
_bstr_t strConnect = "Provider=SQLOLEDB;Persist Security Info=True;\
User Id=sa;Password=123456;Initial Catalog=Test;Data Source=localhost";
//_bstr_t strConnect = "Provider=SQLOLEDB;Server=localhost;DataBase=Test;uid=sa;pwd=123456";
pConn->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error &e)
{
cout<
cout<
cout<
return 0;
}
try
{
pRec = pConn->Execute("select * from CorrespondField",NULL,adCmdText);
if(!pRec->BOF)
{
pRec->MoveFirst();
}
else
{
cout<
return 0;
}
vector<_bstr_t> column_name;
for(int i=0;iFields->GetCount();i++)
{
cout<Fields->GetItem(_variant_t((long)i))->Name<
column_name.push_back(pRec->Fields->GetItem(_variant_t((long)i))->Name);
cout<
}
while(!pRec->adoEOF)
{
for(vector<_bstr_t>::iterator Itr = column_name.begin();Itr!=column_name.end();Itr++)
{
if (pRec->GetCollect(*Itr).vt != VT_NULL)
{
cout<GetCollect(*Itr)<
}
else
{
cout<
}
}
pRec->MoveNext();
cout<
}
}
catch (_com_error &e)
{
cout<
cout<
return 0;
}
try
{
pRec->Close();
pConn->Close();
pRec->Release();
pConn->Release();
}
catch(_com_error &e)
{
cout<
cout<
return 0;
}
CoUninitialize();
return 0;
}
c++ ado连接mysql数据库_C++使用ADO连接数据库及其实例相关推荐
- c 连接mysql数据库_C++连接mysql数据库的两种方法
现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接m ...
- cad与连接mySQL数据库_C++连接mysql数据库的两种方法
现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接m ...
- 使用Java语言开发工具idea连接MySQL数据库的基本步骤及操作实例
Java连接MySQL数据库并进行一些基本操作以及导入jar包的两种方式 其实,任何开发工具连接数据库无非就是三步:1.安装驱动.2.加载驱动,创建连接对象.3.创建对象操作游标.4.游标调用函数完成 ...
- c# 连接mysql数据库_C#连接Mysql数据库
一. ADO.NET访问方式 程序集:Mysql.Data.dll 导入包:using MySql.Data.MySqlClient; 说明:这是MySql为 ADO.NET推出的 访问 Mysql数 ...
- c excel连接mysql数据库_C语言连接Excel数据库
一.问题的提出 在ASP编程中会遇到很多大大小小的难题,我有一次为一家书店设计网站的时候就遇到了一个这样的难题.起初使用Access做数据库,该数据库主要是为了保存书店内图书的信息,但是当记录的条目过 ...
- ado连接mysql失败_VC++中ADO连接数据库失败原因
1.用#import指令引入ADO类型库#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespac ...
- cpp 怎么连接mysql_C++连接mysql数据库的两种方法
现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接m ...
- php pdo 与对比mysql,php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例...
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例 本文实例讲述了php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率.分享给大家供大家参考,具体如下: ...
- pymysql连接mysql数据库try_pymysql 连接数据库和基本使用
pymysql 连接mysql数据库import pymysql.cursors # 连接数据库配置信息 connection = pymysql.connect(host='localhost', ...
最新文章
- 算法之最近最少使用LRU
- .INFO域名总量跌破700万,8月第三周净减51,477个
- ios端 input输入框遮挡问题解决
- kibana 更新 索引模式_elasticsearch – 如何在kibana中自动配置索引模式
- zcmu1716(思维)
- chrome网页自动化插件_chrome网页注释插件
- java httpclient发送json 请求 ,go服务端接收
- Apollo自动驾驶入门课程第⑦讲 — 规划(上)
- Centos7更新 SQLite3至版本3.29.0
- linux服务与进程管理sup,linux下进程管理工具-supervisord
- nio的优势_BIO、NIO、AIO 介绍和适用场景分析
- 散粉在哪个步骤用_底妆的正确步骤是什么?花三分钟带你破译底妆密码
- android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...
- freemark判断传过来的值为空和不为空及问号、感叹号用法
- 在bitbucket.org上创建Git仓库
- 常见端口的作用、漏洞和操作建议(转)
- css阿拉伯数字,css 古文排版(含阿拉伯数字)
- 现代密码学常用符号总结
- 爱学习的小虫子——Who Am I ?
- 七自由度机械臂设计分析——待更新