使用ADO方式连接并操作SQL数据库Access数据库等常用数据库

teardrop

发布日期: 2018-12-31 09:59:50 浏览量: 1596
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

背景

对于数据库的操作使用,对于我们编程开发来说,是比较常见的事情,也是常用的技术。所以,应该要熟悉掌握。对于数据库的操作,基本操作就是增、删、改、查。但是,在进行这些基本操作之前,还有至关重要的一步,就是数据库的连接。对于数据库的成功连接,那么,我们对数据库的操作就完成一半了。很多初学者,都会卡死在数据库连接这一步上面。

本文介绍的是ADO方式连接数据库,并操作数据库。ADO(ActiveX Data Object)具有跨系统平台特性,它直接对DBMS数据库进行操作,即系统中必须有DBMS,但不需要驱动程序,不需要注册数据源,所以具有很好的可移植性。

本文就给出ADO方式连接并操作 SQL Server数据、Access数据库、Oracle数据库、MySQL数据库等常用数据库,虽然有很多数据库,但是它们之间对于ADO来说,只是连接字符串的区别而已。

现在,我就把程序实现的过程整理成文档,分享给大家。

实现原理

ADO对象的导入

在使用ADO技术时需要导入一个ADO动态链接库msado15.dll,该动态库位于系统盘下的”Program Files\Common Files\System\ado\”目录下。然后,我们在程序头文件中,添加下面的导入代码:

  1. #import "C:\\Program Files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")

数据库连接

我们在操作数据库之前,首先要连接数据库。数据库连接至关重要一点就是,数据库连接字符串。现在,我们先来介绍下ADO连接数据库的一个流程:

  • 首先,我们先调用 CoInitialize 初始化COM组件环境,因为ADO方式连接数据库,就是基于COM组件实现的。所以,必须要对COM环境进行初始化

  • 然后,调用 _ConnectionPtr::CreateInstance 函数创建 Connection 对象

  • 创建成功后,对 Connection 对象的连接超时ConnectionTimeout进行设置,同时调用 Open 函数,按照数据库连接字符串连接数据库

经过,这 3 步操作,就成功完成数据库连接的操作。我们上面说,不同数据库,连接字符串也会不同。下面,我就列举常用数据库的连接字符串:

Access连接字符串

  1. Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MDB文件路径;Persist Security Info=False;Jet OLEDB:DataBase Password=数据库密码

数据源连接字符串

  1. "DSN=TestDatabase;UID=;PWD=;"

SQL Server连接字符串

  1. Driver=SQL Server;Server=服务器IP;Database=数据库名称;UID=用户名;PWD=密码

Oracle连接字符串

  1. Provider=MSDAORA.1; Password=sa123; User ID=system; Data Source=192.168.0.221/orcl; Persist Security Info=True

MySQL连接字符串

  1. Driver=MySQL ODBC 5.2 ANSI Driver;SERVER=192.168.0.221;UID=用户名;PWD=密码;DATABASE=test;PORT=端口(默认填写3306)
  1. // 以ADO方式连接数据库
  2. BOOL ADOConnectDatabase(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password)
  3. {
  4. // 初始化COM对象
  5. ::CoInitialize(NULL);
  6. try
  7. {
  8. // 创建Connection对象
  9. HRESULT hr = g_pConnection.CreateInstance("ADODB.Connection");
  10. if (SUCCEEDED(hr))
  11. {
  12. // 连接超时时间 5 秒
  13. g_pConnection->ConnectionTimeout = 5;
  14. // 连接数据库
  15. g_pConnection->Open(ConnectionString, UserID, Password, adModeUnknown);
  16. return TRUE;
  17. }
  18. }
  19. catch (_com_error e)
  20. {
  21. ::MessageBox(NULL, e.Description(), e.ErrorMessage(), MB_OK);
  22. }
  23. return FALSE;
  24. }

执行非查询操作的SQL语句

  • 首先,我们调用 _ConnectionPtr::BeginTrans 函数,开始事务

  • 然后,调用 _ConnectionPtr::Execute 函数执行SQL语句,这里可以提交多条SQL语句。在调用 Execute 函数的时候,数据库还没有执行SQL语句,此时SQL语句还没有生效

  • 最后,我们调用 _ConnectionPtr::CommitTrans 函数提交事务,这时所提交的SQL语句开始按提交顺序执行。如果出错,则调用 _ConnectionPtr::RollbackTrans 函数回滚并结束事务

  1. // 执行操作SQL语句
  2. BOOL ExecuteSQL(char *pszSQL)
  3. {
  4. _variant_t ra;
  5. // 开始事务
  6. g_pConnection->BeginTrans();
  7. try
  8. {
  9. // 执行SQL语句
  10. g_pConnection->Execute((_bstr_t)pszSQL, &ra, adCmdText);
  11. // 提交事务
  12. g_pConnection->CommitTrans();
  13. return TRUE;
  14. }
  15. catch (_com_error e)
  16. {
  17. ::MessageBox(NULL, e.Description(), e.ErrorMessage(), MB_OK);
  18. }
  19. // 如果出现错误,回滚并结束事务
  20. g_pConnection->RollbackTrans();
  21. return FALSE;
  22. }

执行查询操作的SQL语句

查询SQL语句与其它操作的SQL语句不一样,它不是使用 _ConnectionPtr 对象进程操作的,而是使用记录集对象 _RecordsetPtr 来进行实现。

  • 首先,我们调用 _RecordsetPtr::CreateInstance 函数创建并初始化记录集对象

  • 然后,_RecordsetPtr::Open 函数打开记录集并执行查询SQL语句,将查询结果,返回到记录集中

  1. // 执行查询SQL语句
  2. BOOL SearchSQL(char *pszSQL)
  3. {
  4. // 初始化记录集对象
  5. g_pRecordset.CreateInstance(_uuidof(Recordset));
  6. // 打开记录集
  7. g_pRecordset->Open((LPCTSTR)pszSQL, g_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
  8. if (NULL == g_pRecordset)
  9. {
  10. ::MessageBox(NULL, "读取数据库记录出错", "ERROR", MB_OK);
  11. return FALSE;
  12. }
  13. return TRUE;
  14. }

程序测试

我们在 main 函数中调用上述封装好的函数,连接数据库,执行创建demongan数据库表的SQL语句,执行向demongan表插入5条数据的SQL语句,执行查询demongan表所有数据并显示在程序上。main 函数为:

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. BOOL bRet = FALSE;
  4. char szSQL[MAX_PATH] = {0};
  5. // 连接数据库
  6. bRet = ADOConnectDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb", "", "");
  7. if (FALSE == bRet)
  8. {
  9. printf("Connect Database Error.\n");
  10. }
  11. printf("Connect Database OK.\n");
  12. // 执行SQL语句,创建表 demongan
  13. ::wsprintf(szSQL, "CREATE TABLE demongan(ID int, Name varchar(20), Age int)");
  14. bRet = ExecuteSQL(szSQL);
  15. if (FALSE == bRet)
  16. {
  17. printf("Create Table Error.\n");
  18. }
  19. printf("Create Table OK.\n");
  20. // 执行SQL语句,插入 5 条记录
  21. for (int i = 0; i < 5; i++)
  22. {
  23. ::wsprintf(szSQL,
  24. "INSERT INTO demongan(ID, Name, Age) VALUES(%d, \'%s%d\', %d)",
  25. i, "Name", i, i + 1);
  26. bRet = ExecuteSQL(szSQL);
  27. if (FALSE == bRet)
  28. {
  29. printf("Insert Value Error.\n");
  30. }
  31. }
  32. printf("Insert Value OK.\n");
  33. // 查询数据
  34. ::wsprintf(szSQL, "SELECT * FROM demongan");
  35. bRet = SearchSQL(szSQL);
  36. if (FALSE == bRet)
  37. {
  38. printf("Search Value Error.\n");
  39. }
  40. printf("Search Value OK.\n");
  41. // 从记录集中获取数据并显示
  42. _variant_t varID, varName, varAge;
  43. while (!g_pRecordset->adoEOF)
  44. {
  45. // 获取每个字段对应的数据
  46. varID = g_pRecordset->GetCollect("ID");
  47. varName = g_pRecordset->GetCollect("Name");
  48. varAge = g_pRecordset->GetCollect("Age");
  49. // 注意要强制转换下显示类型
  50. printf("%s\t%s\t%s\n", (LPCTSTR)_bstr_t(varID), (LPCTSTR)_bstr_t(varName), (LPCTSTR)_bstr_t(varAge));
  51. // 获取下一行数据
  52. g_pRecordset->MoveNext();
  53. }
  54. system("pause");
  55. return 0;
  56. }

我们直接运行程序,程序提示运行成功,成功连接数据库、创建表、插入数据、查询数据并显示查询结果:

我们打开数据库文件,直接查看,数据成功被插入:

总结

数据库操作要注意 3 个关键点:

  • 一是与数据库的连接,要注意连接字符串一定要写正确,不同类型的数据库,连接字符串也会不同

  • 二是执行数据库的增加、删除、修改等除查询操作之外的SQL语句,先要开始事务,待所有SQL语句提交完毕后,再一次提交事务,交由数据库操作

  • 三是执行数据库的查询语句,查询结果,需要从记录集中一条一条循环获取,要注意循环结束的条件

其中,在显示从数据集获取的数据的时候,我们要对数据进行(LPCTSTR)强制转化你,例如 (LPCTSTR)_bstr_t(varName),否则数据不能正常显示。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download ADO_Test.7z ( 163.37kb, 9次下载 )

发送私信

如果你想飞,放弃一切让你下降的重量

16
文章数
22
评论数
最近文章
eject