5.1.2 ODBC
5.1.2 ODBC
开放数据库互连(Open DataBase Connectivity
,ODBC
)标准定义了一个API
,应用程序用它来打开一个数据库连接、发送查询和更新,以及获取返回结果等。应用程序(例如图形界面、统计程序包或者电子表格)可以使用相同的ODBC API
来访问任何一个支持ODBC
标准的数据库。
每一个支持ODBC
的数据库系统都提供一个和客户端程序相连接的库,当客户端发出一个ODBC API
请求,库中的代码就可以和服务器通信来执行被请求的动作并取回结果.
1 建立一个和服务器的链接
利用ODBC
和服务器通信的第一步是,建立一个和服务器的连接。
为了实现这一步,程序先分配一个SQL
的环境变量,然后是一个数据库连接句柄。ODBC
定义了HENV
、HDBC
和RETCODE
几种类型。程序随后利用SQLConnect
打开和数据库的连接,这个调用有几个参数,包括数据库的连接句柄、要连接的服务器、用户的身份和密码等。常数SQL_ NTS
表示前面参数是一个以n结尾的字符串。
2 通过SQLExecDirect
语句把命令发送到数据库
一旦一个连接建立了,C语言就可以通过SQLExecDirect
语句把命令发送到数据库。
因为C语言的变量可以和查询结果的属性绑定,所以当一个元组被SQLFetch
语句取回的时候,结果中相应的属性的值就可以放到对应的C变量里了。 SQLBindCol
做这项工作;在SQLBindCol
函数里面第二个参数代表选择属性中哪一个位置的值,第三个参数代表SQL
应该把属性转化成什么类型的C变量。再下一个参数给出了存放变量的地址。对于诸如字符数组这样的变长类型,最后两个参数还要给出变量的最大长度和一个位置来存放元组取回时的实际长度。如果长度域返回一个负值,那么代表着这个值为空(mu
)。对于定长类型的变量如整型或浮点型,最大长度的域被忽略,然而当长度域返回一个负值时表示该值为空值。
SQLFetch
在while
循环中一直执行,直到SQLFetch
返回一个非sQL_ SUCCESS
的值,在每一次fetch
过程中,程序把值存放在调用SQLBindCol
所说明的C变量中并把它们打印出来。
3 断开连接释放句柄
在会话结束的时候,程序释放语句的句柄,断开与数据库的连接,同时释放连接和SQL
环境句柄。好的编程风格要求检查每一个函数的结果,确保它们没有错误,为了简洁,我们在这里忽略了大部分检查。
可以创建带有参数的SQL
语句,例如, insert into department values(?,?,?)
。问号是为将来提供值的占位符。上面的语句可以先被”准备”,也就是在数据库中先编译,然后可以通过为占位符提供具体值来反复执行——在该例中,为department
关系提供系名、楼宇名和预算数。
ODBC
为各种不同的任务定义了函数,例如查找数据库中所有的关系,以及查找数据库中某个关系的列的名称和类型,或者一个查询结果的列的名称和类型。
在默认情况下,每一个SQL
语句都被认为是一个自动提交的独立事务。调用sQLSet ConnectOption(comn, SQL_ AUTOCOMMIT,0)
可以关闭连接com
的自动提交,事务必须通过显式地调用SQLTransact(comn, SQL _COMMIT)
来提交或通过显式地调用SQLTransact(comn, SQL_ROLLBACK)
来回滚。ODBC
标准定义了符合性级别( conformance level
),用于指定标准定义的功能的子集。一个ODBC
实现可以仅提供核心级特性,也可以提供更多的高级特性( level
1或level2
)。 level I
需要支持取得目录的有关信息,例如什么关系存在,它们的属性是什么类型的等。 level
2需要更多的特性,例如发送和提取参数值数组以及检索有关目录的更详细信息的能力.SQL
标准定义了调用级接口( Call level Interface,CI
),它与ODBC
接口类似。
ADO.NET
ADO.NET API
是为Visual basic.NET
和C#语言设计的,它提供了一系列访问数据的函数,与JDBC
在上层架构没有什么不同,只是在细节上有差别。像JDBC
和ODBC
一样,ADO.NET API
可以访问SL
查询的结果,以及元数据,但使用起来比ODBC
简单得多。可以使用ADO.NET API
来访问支持ODBC
的数据库,此时,ADO.NET
调用被转换成ODBC
调用。ADO.NET API
也可以用在某些非关系教据源上,例如微软的OLE
-DB
、XML
(在第23章介绍),以及微软最近开发的实体框架。有关ADO.NET
的更多信息请参考文献注解。
我这里主要是用java
来操作数据库,ODBC
这里了解个大概即可