C++ 尝试选择SQL API库

C++ 尝试选择SQL API库,c++,sql,api,odbc,C++,Sql,Api,Odbc,我刚刚开始学习如何编写访问SQL server的软件。似乎每个服务器实现(PASGRESS、MySQL等)都为各种语言提供API库(我的代码是C和C++,虽然java和Python的解决方案也会引起我的兴趣)。但是,我对依赖这些库有点担心,因为我更喜欢与供应商无关的解决方案 据我所知,微软的ODBCAPI是为了解决C/C++(和JDBC for Java)的此类问题;unixODBC似乎是一种流行的实现。到目前为止我是对的吗 此外,有没有这样的库提供面向对象的接口?最好不要简单地将SQL查询嵌入

我刚刚开始学习如何编写访问SQL server的软件。似乎每个服务器实现(PASGRESS、MySQL等)都为各种语言提供API库(我的代码是C和C++,虽然java和Python的解决方案也会引起我的兴趣)。但是,我对依赖这些库有点担心,因为我更喜欢与供应商无关的解决方案

据我所知,微软的ODBCAPI是为了解决C/C++(和JDBC for Java)的此类问题;unixODBC似乎是一种流行的实现。到目前为止我是对的吗

此外,有没有这样的库提供面向对象的接口?最好不要简单地将SQL查询嵌入到另一种更具特色的语言中;我也希望有一个模仿语言其他部分风格的包装器


那么,有没有一个更好的解决方案?我是在要求一些奇怪的东西吗?

ODBC/JDBC试图抽象出数据库接口,以提供一致的编程模型。请记住,通过使用这种最小公分母接口,您无法利用给定DB可能提供的特定非标准功能


要获得数据模型的面向对象接口,请研究对象关系映射(ORM)解决方案,如。ORM解决方案将您的对象映射到它们在关系数据库中的表示形式,从应用程序编程的角度来看,通常会使数据持久化变得更简单。

的确,ODBC/JDBC是有助于使供应商之间的调用接口成为标准的库,但您是对的,每个RDBMS都有自己的SQL风格。ODBC/JDBC不能帮助抽象SQL语法

将文字SQL移出应用程序代码的一个解决方案是在驻留在每个数据库后端的存储过程中实现查询,然后使用ODBC/JDBC调用存储过程。您可以为使用的每种RDBMS定义具有类似名称和调用接口的存储过程。但是请注意,存储过程语言在不同的供应商之间也是可变的

另一种解决方案是使用“对象关系映射”技术,如Hibernate for Java或NHibernate for.NET。这些技术可以使使用数据库时感觉更“面向对象”,并且在许多情况下使您不必编写文字SQL

但是大多数ORM工具倾向于关注非常简单的查询。如果查询非常复杂(例如使用
groupby
JOIN
),那么使用ORM工具比使用文字SQL更难

另见“

如果SQL给您带来那么多麻烦,您可能根本不会喜欢使用RDBMS。例如,一些程序员看不到规范化规则的价值。如果这对您来说是真的,那么您可能希望研究非关系数据存储的新兴技术,包括:

据我所知,微软的ODBCAPI是为了解决C/C++(和JDBC for Java)的此类问题;unixODBC似乎是一种流行的实现。到目前为止我是对的吗

对。Python的ODBC或JDBC的等价物称为。Perl的等价物称为DBI

此外,有没有这样的库提供面向对象的接口?最好不要简单地将SQL查询嵌入到另一种更具特色的语言中;我也希望有一个模仿语言其他部分风格的包装器

是的,对于不同的语言有很多类似的东西。C#有,Smalltalk有Roe和,Python有and(Python中的Django有很多(参见)),Ruby有ActiveRecord,等等。我不知道你在C++中使用什么,但我敢打赌,它必须使用很多丑陋的模板黑客来处理这些问题。
所有这些选择似乎都是压倒性的,但您对语言的选择很可能会受到一些因素的影响,而不是使用关系数据的便利性。(如果不是,你应该考虑Prolog)。这可能会把你或多或少地和你一样讨厌的ORM联系在一起。

< P> CuxCE是一个C++库,允许你使用C++语法和C++类型,并使用SQL的特征集。目前它只支持PostgreSQL和sqlite,但始终可以添加新的后端。见quince-lib.com。(完全披露:我写的。)

看看Qt。它不是一个库,而是一个完整的框架。它有一个非常优秀的SQL模块

qtsql是一个重要的模块,它提供对SQL的支持 数据库。Qt SQL的API分为不同的层:

Driver layer
SQL API layer
User interface layer