广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
C++利用 ADO 连接数据库
关于 vc6.0/VS 中实现 ADO SQL 数据库连接的文章网上虽然很多,但大多写的很繁琐,对于我们这
样的菜鸟来说,还是很希望有一篇简单化的文章的。希望跟我一样的菜鸟们学得开心!
源代码下载:
案例 1:contact.cpp : http://pan.baidu.com/s/1slJRtgD
案例 2:contact1.cpp: http://pan.baidu.com/s/1gfvjiDH
实践过程:
(1) 首先,用 VS2013 建立一个 c++项目,然后新建好一个 contact.cpp 文件。
(2) 然后复制粘贴下面的代码——运行。
实例代码:
#include
#include
#include
#include
using namespace std;
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
void main()
{
CoInitialize(NULL); //初始化 COM 环境
_ConnectionPtr sqlSp; //初始化指针,建立与服务器的连接
HRESULT hr = sqlSp.CreateInstance(_uuidof(Connection));
if (FAILED(hr)) //发生连接错误
{
}
cout << "_ConnectionPtr 对象指针实例化失败!!!" << endl;
return;
else {
//初始化连接参数
_bstr_t strConnect = "Driver={sql server};server=127.0.0.1,1433;uid=sa;pwd=1234;database=table1;";
//_bstr_t strConnect="Provider=SQLOLEDB;Server=127.0.0.1,1433;Database=PBMS;uid=sa;pwd=pp471006459;";
//_bstr_t strConnect="Provider=SQLOLEDB.1;Password=pp471006459;Persist Security Info=True;User ID=sa;"
//"Initial Catalog=PBMS;Data Source=127.0.0.1,1433";
//以上这三条 strConnect 语句都可以用!!看自己喜好选择用吧
//要注意修改用户名 uid、密码 pwd、数据库名 database,这三个参数均是你自己 sql server 的数据库信息
·1·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
try { //执行连接
sqlSp->Open(strConnect, "", "", adModeUnknown);
}
catch (_com_error &e) { //连接失败,捕获相应的信息
cout << e.Description() << endl;
}
_RecordsetPtr m_pRecordset; //记录集对象指针,用来执行 SQL 语句并记录查询结果
if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
{
}
cout << "记录集对象指针实例化失败!" << endl;
return;
//char strSQL[]="SELECT * FROM mytable";
try {
m_pRecordset->Open("SELECT * FROM mytable", (IDispatch*)sqlSp, adOpenDynamic, adLockOptimistic, adCmdText);
//打开数据库,执行 SQL 语句
}
catch (_com_error &e) //打开数据库失败
{
}
cout << e.Description() << endl;
try { //读取记录
m_pRecordset->MoveFirst();
while (!m_pRecordset->adoEOF)
{
string name = (char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value); // 输出相应
cout << name << endl;
m_pRecordset->MoveNext();
的数据信息
}
}
catch (_com_error &e)
{
}
cout << e.Description() << endl;
}
system("pause");
·2·
}
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
第一步 系统配置
代码步骤解读
1.设置 SQLSERVER 服务器为 SQL 登录方式,并且系统安全性中的 sa 用户要设置登录功能为“启用”,
还有必须要有密码。
2.需要在 ODBC 中进行数据源配置,数据源选\”SQL SERVER”,登录方式使用“使用输入用户登录 ID
和密码的 SQL SERVER 验证”,并填写登录名(sa)和密码。
注意一点,密码不能为空,这就意味着你的 sa 用户必须得有密码。否则无法通过系统本身的安全策
略。测试通过就完成了配置。
第二步 C++与 SQL 连接初始化
1.在你所建立的 C++项目中的 stdafx.h 头文件中引入 ADO 连接文件。
具体代码如下
#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace
rename(”EOF”,
“adoEOF”) rename(”BOF”, “adoBOF”)
2.定义_ConnectionPtr 变量后调用 Connection 对象的 Open 方法建立与服务器的连接。
数据类型_ConnectionPtr 实际上是由类模板_com_ptr_t 得到的一个具体的实例类。
_ConnectionPtr 类封装了 Connection 对象的 Idispatch 接口指针及其一些必要的操作。可以通过这个
指针操纵 Connection 对象。
例如连接 SQLServer 数据库:
代码如下:
//连接到 MS SQL Server
·3·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
CoInitialize(NULL); //调用 COM 时(比如 ADO 等)必须先用 CoInitialize(NULL)初始化 COM
_ConnectionPtr pMyConnect = NULL; //初始化指针,建立与服务器的连接
HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr)) { //发生连接错误
cout << "_ConnectionPtr 对象指针实例化失败!!!" << endl;
return;
}
Else {
//初始化链接参数
_bstr_t strConnect = “Provider=SQLOLEDB; Server=hch; Database=mytest; uid=sa; pwd=1234;”;
//Database 指你系统中的数据库
try //执行连接
{
}
// Open 方法连接字串必须四 BSTR 或者_bstr_t 类型
pMyConnect->Open(strConnect, “”, “”, NULL);
catch(_com_error &e) //发生链接错误,捕获错误信息
MessageBox(e.Description(), “警告”, MB_OK|MB_ICONINFORMATION);
{
}
第三步 简单的数据连接
//定义_RecordsetPtr 变量,调用它 Recordset 对象的 Open,即可打开一个数据集
//初始化过程 以下是个实例
_RecordsetPtr pRecordset; //记录集对象指针,用来执行 SQL 语句并记录查询结果
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
cout << "记录集对象指针实例化失败!" << endl;
return;
}
try { //打开数据库,执行 SQL 语句
m_pRecordset->Open("SELECT * FROM mytable", (IDispatch*)sqlSp, adOpenDynamic, adLockOptimistic,
adCmdText);
}
·4·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
catch (_com_error &e) //打开数据库失败
{
}
cout << e.Description() << endl;
第四步 执行 SQL 语句
这里是关键,我认为只要你懂点 SQL 语句那么一切都会方便许多比用上面的方法简单,更有效率点。
首先
m_pConnection.CreateInstance(_uuidof(Connection)); //初始化 Connection 指针
m_pRecordset.CreateInstance(__uuidof(Recordset)); //初始化 Recordset 指针
CString strSql=”select * from tb_goods”; //具体执行的 SQL 语句(查询功能)
m_pRecordset=m_pConnection->Execute(_bstr_t( strSql ), NULL, adCmdText);
//将查询数据导入 m_pRecordset 数据容器
至此,你的 SQL 语句已经执行完成了 m_pRecordset 内的数据就是你执行的结果。
取得记录:
while(!m_pRecordset->adoEOF) //遍历并读取 name 列的记录并输出
{
string name = (char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
//输出相应的数据信息
cout << name << endl;
m_pRecordset->MoveNext(); //移动游标
}
插入记录
//记得初始化指针再执行以下操作
CString strsql;
strsql.Format(”insert into tb_goods(no,name, price)
values(’%d’,'%s’, %d)”,m_intNo,m_strName,m_intPrice);
m_pRecordset=m_pConnection->
Execute(_bstr_t(strsql),NULL,adCmdText);
·5·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
修改记录
CString strsql;
strsql.Format(”update tb_goods set name=’%s’ ,
price=%d where no=%d “,m_strName,m_intPrice,m_intNo);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);
删除记录
CString strsql;
strsql.Format(”delete from tb_goodswhere no= ‘%d’ “,m_intNo);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);
实例 2:
/*******************************************************************
利用 C++ ADO 访问 SQL2012
要求:
【1】输出 stu_info 表内的每一条记录
【2】添加一条新记录
【3】删除名字为"小花"的记录
*/
#include
#include //for setw()
using namespace std;
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
class STU
{
public:
char snum[10]; //学号
char sname[10]; //姓名
char sphone[15]; //电话
public:
STU(){}
~STU(){}
};
int main()
{
·6·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
STU student;
::CoInitialize(NULL); // 初始化 OLE/COM 库环境 ,为访问 ADO 接口做准备
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
_bstr_t bstrSQL("select * from mytable"); //查询语句
char * query_cmd = "delete from mytable where name = '小花'";
try
{
// 创建 Connection 对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是 BSTR 型或者_bstr_t 类型
_bstr_t strConnect = "Driver={sql server};server=127.0.0.1,1433;uid=sa;pwd=1234;database=table1;";
m_pConnection ->Open(strConnect, "", "", adModeUnknown);
if (m_pConnection == NULL)
cout<<"data ERROR!";
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(),
adOpenDynamic, adLockOptimistic, adCmdText);
_variant_t vsnum,vsname, vsphone; //对应库中的 num,name, phone
cout << "学号 姓名 电话 ";
cout << "\n----------------------------------------------------------------\n";
while (!m_pRecordset->adoEOF)
{
vsnum = m_pRecordset->GetCollect("num"); //这儿给字段编号和字段名都可以
vsname = m_pRecordset->GetCollect("name");
vsphone = m_pRecordset ->GetCollect("phone");
if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsphone.vt != VT_NULL)
{
cout.setf(ios::left);
cout << setw(14) <<(char*)(_bstr_t)vsnum;
cout << setw(14) <<(char*)(_bstr_t)vsname;
·7·
广工 大学城 15 物联网4 Wisdom 整理(原文档来源:http://blog.csdn.net/ljh56789/article/details/8061323)
cout << setw(8) << (char*)(_bstr_t)vsphone;
cout.unsetf(ios::left);
cout << endl;
}
m_pRecordset ->MoveNext(); ///移到下一条记录
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n 请输入你要添加的学生信息\n";
cout << "学号:";
cin >> student.snum;
cout << "\n 姓名:";
cin >> student.sname;
cout << "\n 电话:";
cin >> student.sphone;
m_pRecordset ->MoveFirst(); //移动到第一条记录
m_pRecordset ->AddNew(); ///添加新记录
m_pRecordset ->PutCollect("num", _variant_t(student.snum));
m_pRecordset ->PutCollect("name", _variant_t(student.sname));
m_pRecordset ->PutCollect("phone", _variant_t(student.sphone));
m_pRecordset ->Update(); //更新数据
//m_pConnection ->Execute(query_cmd, NULL, 1); //用 Execute 执行 sql 语句来删除
m_pRecordset ->Close(); // 关闭记录集
}
// 捕捉异常
catch (_com_error e)
{
}
// 显示错误信息
cerr << "\nERROR:" <<(char*)e.Description();//抛出异常
if (m_pConnection ->State)
m_pConnection ->Close();
::CoUninitialize();
return 0;
·8·
}