logo资料库

C++利用ADO连接数据库 (菜鸟必学).pdf

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
广工 大学城 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· }
分享到:
收藏