天天看点

一个常见数据库操作错误的分析(二)

进一步查找资料,发现在使用Java连接SQL Server或者Access数据库时也会有类似的问题。其中一位网友的问题描述如下:

我用JDBC-ODBC桥连,代码应该是没问题的,ODBC数据源也是配置成功了的。但就是有异常:

[Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序

我百思不得其解,上网查资料,GOOGLE搜,还是没解决问题。此时,我已经搞了2天了,还是没搞好。第三天,上网看到用SQL Server的驱动来连,不用JDBC-ODBC,这次是成功了的,但现在还是没弄清楚用我这里用JDBC-ODBC连就不行。

附上:JDBC连SQL Server数据库的方法。

首先要下载SQL Server 2000 Driver for JDBC SP3,在微软的观网上有( http://www.microsoft.com/downloads/details.aspx?FamilyID=07287b11-0502-461a-b138-2aa54bfdc03a&displaylang=en)。还要为SQL Server 2000数据库打上SP3补丁。(http://www.microsoft.com/china/sql/downloads/sp3.asp)。

将SQL Server 2000 Driver for JDBC SP3安装后,会在它的lib目录下有三个包:msutil.jar,msbase.jar,mssqlserver.jar

可以在环境变量中的CLASSPATH中添加这三个包:

新建个JDBC_HOME = D:/Microsoft SQL Server 2000 Driver for JDBC(这是你安装Driver的目录)

CLASSPATH = .;%JDBC_HOME%/lib/msbase.jar;%JDBC_HOME%/lib/mssqlserver.jar;%JDBC_HOME%/lib/msutil.jar

准备工作就结束了,在程序中和JDBC-ODBC桥连差不多,先是注册你的驱动,

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").netInstance();

然后建立连接

String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Coffees";

这里的localhost是你的数据库服务器所在的IP地址,或者主机名。DatabaseName是你想要连接的数据库。

总结:“看来jdbc-odbc桥是不行,要用jdbc for sql server”

看来有必要研究一下Windows平台上数据库连接的知识了。

[ODBC API访问数据库]

在没有ODBC以前

请允许我将那时候成为第二黑暗时代,第一黑暗时代是没有数据库的时代。

ODBC的出现结束了数据库开发的无标准时代。在没有ODBC以前不同的数据库的开发所采用的标准是不统一的。一般来讲不同的数据库厂商都有自己的数据库开发包,这些开发包支持两种模式的数据库开发:预编译的嵌入模式(例如Oracle的ProC,SQL Server的ESQL)和API调用(例如Oracle的OCI)。

对于一个开发人员来讲使用预编译方式开发是极其痛苦的,我就有过这样的经历,所有的SQL语句要写在程序内部,并且遵守一定的规则,然后由数据库厂商的预编译工具处理后形成C代码,最后由C编译器进行编译。预编译的最大问题就在于无法动态的生成SQL语句,我想作为一个程序员是很难接受的。

接下来的是使用API进行开发,和预编译相比算是前进了一大步。数据库厂商提供了开发包,你通过各种API函数就可以连接数据库,执行查询、修改、删除,操纵光标,执行存储过程等。对于程序员来讲有了更多的自由,而且可以创建自己的开发包。但是这一切的开发只能针对同一种数据库。

Oracle的OCI是一个非常优秀的C语言开发包,在ODBC中就在很多地方参照了OCI的设计。

ODBC介绍

ODBC(Open Database Connectivity)是由微软公司提出的一个用于访问数据库的统一界面标准,随着客户机/服务器体系结构在各行业领域广泛应用,多种数据库之间的互连访问成为一个突出的问题,而ODBC成为目前一个强有力的解决方案。ODBC之所以能够操作众多的数据库,是由于当前绝大部分数据库全部或部分地遵从关系数据库概念,ODBC看待这些数据库时正是着眼了这些共同点。虽然支持众多的数据库,但这并不意味ODBC会变得复杂,ODBC是基于结构化查询语言(SQL),使用SQL可大大简化其应用程序设计接口(API),由于ODBC思想上的先进性,而且没有同类标准或产品与之竞争,因而越来越受到众多厂家和用户的青睐。目前,ODBC已经成为客户机/服务器系统中的一个重要支持技术。

在1994年时ODBC有了第一个版本,这种名为Open Data Base Connection(开放式数据库互连)的技术很快通过了标准化并且得到各个数据库厂商的支持。ODBC在当时解决了两个问题,一个是在Windows平台上的数据库开发,另一个是建立一个统一的标准,只要数据厂商提供的开发包支持这个标准,那么开发人员通过ODBC开发的程序可以在不同的数据库之间自由转换。这对开发人员来说的确值得庆贺。

ODBC参照了X/OpenData Management: SQL Call-Level Interface和ISO/ICE1995 Call-Level Interface标准,在ODBC版本3.X中已经完全实现了这两个标准的所有要求。所以本书所有内容都基于ODBC 3.0以上版本。

最开始时支持ODBC的数据库只有SQL Server,ACCESS,FoxPro,这些都时微软的产品,他们能够支持ODBC一点也不奇怪,但是那时候Windows的图形界面已经成为了客户端软件最理想的载体,所以各大数据厂商也在不久后发布了针对ODBC的驱动程序。

在Windows 3.X和Windows 95的时候ODBC并不作为系统的组成部分出现,使用前必须另行安装。但到了Windows 98的时候,当你安装好操作系统后,ODBC不需要另行安装了,因为它已经成为了操作系统的一部分。这对很多拒绝ODBC的人来说又少了一个借口。

作为一个程序员,至少是我,我实在找不出什么理由不为ODBC欢呼。此外ODBC的结构很简单和清晰,学习和了解ODBC的机制和开发方法对学习ADO等其他的数据库访问技术会有所帮助。

ODBC结构

图2.1显示了ODBC的结构。

图2.1

应用程序(Application)

应用程序本身不直接与数据库打交道,主要负责处理并调用ODBC函数,发送对数据库的SQL请求及取得结果。

驱动程序管理器(Driver Manager )

驱动程序管理器是一个带有输入程序的动态链接库(DLL),主要目的是加载驱动程序,处理ODBC调用的初始化调用,提供ODBC调用的参数有效性和序列有效性。

驱动程序(Driver)

驱动程序是一个完成ODBC函数调用并与数据库相互影响的DLL,这些驱动程序可以处理对于特定的数据的数据库访问请求。对于应用驱动程序管理器送来的命令,驱动程序再进行解释形成自己的数据库所能理解的命令。驱动程序将处理所有的数据库访问请求,对于应用程序来讲不需要关注所使用的是本地数据库还上网络数据库。

ODBC的一致性

ODBC接口的优势之一为互操作性,程序设计员可以在不指定特定数据源情况下创建ODBC应用程序。从应用程序角度方面,为了使每个驱动程序和数据源都支持相同的ODBC函数调用和SQL语句集,ODBC接口定义了一致性级别,即ODBC API一致性和ODBC SQL语法一致性。SQL一致性规定了对SQL语句语法的要求,而API一致性规定了驱动程序需要实现的ODBC函数。一致性级别通过建立标准功能集来帮助应用程序和驱动程序的开发者,应用程序可以很容易地确定驱动程序是否提供了所需的功能,驱动程序可被开发以支持应用程序选项,而不用考虑每个应用程序的特定请求。

[使用ODBC进行数据库开发基本知识介绍]

建立ODBC DSN

DSN(Data Source Name)是用于指定ODBC与相关的驱动程序相对应的一个入口,所有DSN的信息由系统进行管理,一般来讲当应用程序要使用ODBC访问数据库时,就需要指定一个DSN以便于连接到一个指定的ODBC驱动程序。在控制面板中打开ODBC管理器,回看到如图2.2的界面。

图2.2

DSN共分为三类:

l          用户DSN:对当前登录用户可见,只能够用于当前计算机。

l          系统DSN:对当前系统上所有用户可见,包括NT中的服务。

l          文件DSN:DSN信息存放在文件中,对能够访问到该文件的用户可见。

一个使用Access数据库的DSN中的信息如下:

[ODBC]

DRIVER=Driver do Microsoft Access (*.mdb)

UID=admin

DefaultDir=C:/www.vchelp.net/DB

DBQ=C:/www.vchelp.net/DB/chat.mdb

对于文件DSN来讲这些信息存放在文件中,对于用户DSN和系统DSN来讲这些信息存放在注册表内。你可以通过创建文件DSN来查看每种DSN对应的信息内容。

下面的例子将告诉你如何添加一个SQL Server的DSN。

图2.3

图2.3中的四个步骤分别是:

l          选择SQL Server作为驱动程序

l          输入DSN名称和SQL Server服务器地址或别名

l          输入用户和口令进行连接

l          选择默认数据库并完成

使用ODBC所需要的文件

你需要下面的文件:

l          sql.h:包含有基本的ODBC API的定义。

l          sqlext.h:包含有扩展的ODBC的定义。

l          odbc32.lib:库文件。

这些文件在VC6,VC7都已经随开发工具提供了,不需要另外安装。

此外所有的ODBC函数都以SQL开始,例如SQLExecute,SQLAllocHandle。

注意:以上内容主要摘录自http://www.vchelp.net/wyy/wyy.asp

下一次进一步分析还有什么其他的方法