当前位置:C++技术网 > 资讯 > [Win32] 如何能够实现通用数据库操作方法

[Win32] 如何能够实现通用数据库操作方法

更新时间:2017-04-30 11:22:20浏览次数:1+次

    最近学习数据库操作过程中,我选择使用微软的Access数据库来练手,后来出现了一些问题,最主要的就是版本不通用的问题。


    1.通过网络搜索,现在主流都是ADO操作数据库。ADO实现方法,在StdAfx.h头文件中添加下行代码,并通过智能指针_CommandPtr,_RecordsetPtr,_ConnectionPtr,来操作操作数据库。


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


    这时我感到疑惑:

    1-1. 万一别人的电脑内没有这个DLL怎么办?

    1-2. 我的电脑是64位,系统文件内DLL也是64位的,编译时选择了生成32位程序,别人的电脑是32位怎么办?

    1-3. 我的是WIN7系统的DLL,放到XP岂不是不能操作了?

    1-4. no_namespace rename("EOF","adoEOF") 的意思是打开adoEOF命名空间,万一以后源码给别人使用,别的命名空间正好又是adoEOF,这不就重名了吗?就没有办法实现 不用打开命名空间 也能使用ADO吗?

    

    2. 后来我又查了查网络,可以使用 MFC 的 CDatabase 来实现操作数据库。但是这不符合我的要求,我的要求是能够在WIN32控制台程序中实现操作数据库。


    3. 最后在百度文库内看到可使用 ODBC API 来调用任何版本的数据库,但是我通过搜索引擎找关于 ODBC API 的信息,实在是太少了,很多人都是劝使用ADO方式来操作数据库,这让我很头疼。


    希望C++技术网能指引一下我,最后感谢C++技术网的回答。

  


C++技术网会员解答:

    您好,感谢您对我们C++技术网的支持与信任。

    现在对你的疑问一条条解答:

1-1:如果程序依赖系统的一些库,那么别人系统就必须有安装对应的库。当然,如果你想不对系统安装的库产生依赖,你可以将对应的库生成静态库,编译链接进你的程序,你的程序文件就大些。或者如果用动态库,就需要将对应的动态库复制到exe所在的目录,一起打包发给别人。这样别人电脑不需要安装对应的库。还有一种做法就是,很多安装程序会检测系统是否安装了对应的库,如果没有安装,就自动为系统安装,这样也是一种解决办法。鉴于你的情况,就直接将动态库放到exe目录下即可。

1-2和1-3:不管是动态库还是可执行文件,都需要对应好位数(32位或64位)以及系统的版本,不能混用。你编译成什么样的目标版本,就需要运行的系统是什么样的版本。编译时会根据位数来生成对应位数的机器指令,而系统版本会使用对应版本的API函数。所以,位数不同,系统版本不同,都可能出现指令错误或者API不兼容或不存在的问题。系统会通过动态库和可执行文件的信息分析出位数和版本,提前做出判断。如果不合适,不会让程序执行的。

1-4:adoEOF的命名空间是大家熟知的,一般有所了解的不会用这样特定的命名空间的。当然,如果你不知道,又是用了这个命名空间的库,自己不知道。同时自己还定义了这样的命名空间,自然就会产生命名空间冲突。这时候的问题是你自己的问题,自己应该去避开这种低级错误,而不是去找ado的问题。如果自己的动态库确实是adoEOF,那也绝不会同时使用了系统提供的adoEOF。所以如果你刚好这么不幸,既要用别人的adoEOF命名空间的库,还要用系统的这个命名空间的库,你只要不将两者在同一个文件中引用就行。再或者确实需要在同一个文件中使用两个,你把前面默认定义的adoEOF改为其他名字就好了。

2和3:如果你用mfc的类实现,自然需要依赖mfc。mfc也只不过是包装了ado而已。你可以去找ado最原始的API来操作,引用对应的组件库,然后用API操作就行。你也可以封装一套操作ado数据库的类。虽然会原始些,但是刚好符合你的需求。当然如果你觉得ado还不够底层,使用obdc也是可以的。odbc是系统自带的数据库驱动,无需再安装,通用性好。可以操作excel和access以及其他数据库,都使用标准的sql语句实现。odbc的编程实现资料,C++技术网很早就有一系列了,只是你不知道去搜索而已。你在网站的数据库栏目下找最早的文章,可以找到的。还包括ado数据库的操作类的封装类。

    最后,记得将这个解答分享给那些问过问题的朋友吧,既然他们帮助过你,你得到解答后,也应该回报一下,还可以一起学习交流,对于更多的细节可以一起讨论。