嵌入式SQL和ODBC的使用
- 格式:doc
- 大小:485.50 KB
- 文档页数:27
ODBC和JDBCODBC:Open DataBase Connection1.ODBC是什么 ODBC是⼀种标准--不同语⾔的应⽤程序与不同数据库服务器之间通讯的标准,可以配合很多⾼级语⾔来使⽤2.ODBC的内容 (1)⼀组API(应⽤程序接⼝),⽀持应⽤程序与数据库服务器的交互 (2)应⽤程序通过调⽤ODBC API,实现 1)与数据服务器的连接 2)向数据库服务器发送SQL命令 3)⼀条⼀条的提取数据库检索结果中的元组传递给应⽤程序的变量 (3)具体的DBMS提供⼀套驱动程序,即Driver 库函数,供ODBC调⽤,以便实现数据库与应⽤程序的连接3.应⽤程序如何通过ODBC连接⼀个数据库服务器 (1)ODBC应⽤前,需要确认具体DBMS Driver被安装到ODBC环境中 (2)当应⽤程序调⽤ ODBC API时,ODBC API 会调⽤具体DBMS Driver库函数,DBMS Driver库函数则与数据库服务端通讯,执⾏相应的请求动作并返回检索结果 (3)ODBC应⽤程序⾸先要分配⼀个SQL环境,再产⽣⼀个数据库连接句柄 (4)应⽤程序通过使⽤SQLConnect(),打开⼀个数据库连接,SQLConnect()的具体参数: 1)connection handle,连接句柄 2)the server,要连接的数据库服务器 3)the user identifier,⽤户 4)password,密码 5)SQL_NTS类型说明前⾯的参数是空终⽌的字符串 (5)举例1int ODBCexample()2 {3//分配数据库连接环境4 RETCODE error; //返回状态吗5 HENV env; //环境变量6 HDBC conn; //连接句柄7 SQLAllocEnv(&env);8 SQLAllocConnect(env,&conn);9//打开⼀个数据库连接10 SQlConnect(conn,"",SQL_NTS,"avi",SQL_NTS,"avipasswd",SQL_NTS);1112 {13 ...Do actual work ...14 }1516//断开连接与释放环境17 SQLDisconnect(conn);18 SQLFreeConnect(conn);19 SQLFreeEnv(env);20 }View Code4.应⽤程序如何通过ODBC与数据库服务器进⾏通讯 (1)应⽤程序使⽤SQLExecDirect()函数向数据库发送SQL命令 (2)使⽤SQLFetch()获取产⽣的结果元组 (3)使⽤SQLBindCol()绑定C语⾔变量与结果中的属性 1)当获取⼀个元组时,属性值会⾃动地传送到相应的C语⾔变量中 2)SQLBindCol()的参数 ODBC定义的stmt变量,查询结果中的属性位置 SQL到C的类型变换,变量的地址 对于类似字符数组⼀样的可变长度类型,应该给出 a.变量的最⼤长度 b.当获取⼀个元组后,实际长度的存储位置 c.当返回的实际长度是负数时,说明是⼀个空值5.ODBC的其他功能 (1)动态SQL语句的预编译-动态参数传递功能 (2)获取元数据特性 1)发现数据库中的所有关系的特性 2)发现每⼀个查询结果的列的名字和类型等 (3)默认每⼀条SQL语句都被作为⼀个独⽴的能够⾃动提交的事务来处理 1)应⽤程序可以关闭⼀个连接的⾃动提交特性 2)有些事务要显式的给出提交和撤销的命令JDBC:Java DataBase Connection1.JDBC是什么? JDBC是⼀组Java版的应⽤程序接⼝API,提供了Java应⽤程序与数据库服务器的连接和通讯能⼒2.JDBC API JDBC API分为两个程序包 (1)Java.sql:核⼼API--使⽤java.sql.DriverManager类,java.sql.Driver和java.sql.Connection接⼝连接到数据库 (2)javax.sql:可选扩展API--包含了JNDI的资源,以及管理连接池,分布式事务等,使⽤DataSource接⼝连接到数据库3.JDBC的功能 (1)核⼼API所包含的功能 1)java.sql.DriverManager--处理驱动的调⼊并且对产⽣新数据库连接提供⽀持 2)java.sql.Driver--通过驱动对数据库访问,连接到数据库的应⽤程序必须具有该数据库的特定驱动 3)java.sql.Connection--代表对特定数据库的连接 4)java.sql.Statement--对特定的数据库执⾏SQL操作 5)java.sql.PreparedStatement--⽤于执⾏预编译的SQL语句 6)java.sql.CallableStatement--⽤于执⾏对数据库内嵌过程的调⽤ 7)java.sql.ResultSet--从当前执⾏的SQL语句中返回结果数据 (2)java⾃带的异常捕获及其处理 Try(...) Catch(...)4.应⽤程序使⽤ java api 访问数据库的过程 (1)概念性的过程 1)打开⼀个连接:创建“Statement”对象,并设置查询语句 2)使⽤Statement对象执⾏查询,发送查询给数据库服务器和返回结果给应⽤程序 3)处理错误的例外机制 (2)实际过程 1)传递⼀个Driver给DriverManager,加载数据库驱动 //Class.forName() 2)通过URL得到⼀个Connection对象,建⽴数据库连接 //DriverManger.getConnection(sDBRrl) or DriverManger.getConnection(sDBUrl, sDBRserID, sDBPassword) 3)创建⼀个Statement对象(PreparedStatement 或 CallableStatement),⽤来查询或修改数据库 //Satement stmt = con.createStatement stmt是⼀个Statement类型的句柄 4)查询返回⼀个ResultSet //ResultSet rs = stmt.executeQuery(sSQL) 5)错误捕获语句 (3)更新操作Update to database (4)查询操作Execute query and fetch and print results (5)⽰例1//Java 类2public static void JDBCexample(String dbid, String userid, String passwd)3 {4try{5 Class.forName("oracle.jdbc.driver.OracleDriver");6 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@:1521:univdb",userid,passwd);7 Statement stmt = conn.createStatement();8try{9 stmt.executeUpdate("insert into instructor values('77978','Kim','Physics','98000')");10 }catch(SQLException sqle){11 System.out.println("Could not insert tuple."+sqle);12 }13 ResultSet rset = stmt.executeQuery("select dept_name, avg(salary)"+"from instructor group by dept_name");14while(rset.next())15 {16 System.out.println(rset.getString("dept_name")+""+rset.getFloat(2));17 }18 stmt.close();19 conn.close();20 }catch (SQLException sqle){21 System.out.println("SQLException:"+sqle);22 }23 }View Code5.ODBC和JDBC⽐较 (1)嵌⼊式SQL的思维模式:语句形式执⾏ 建⽴数据连接--声明⼀个游标--打开游标--获取⼀条记录--关闭游标--断开数据库连接 (2)ODBC的思维模式:API函数形式执⾏ 建⽴数据库连接--分配语句句柄--⽤句柄执⾏SQL--建⽴⾼级语⾔变量与句柄属性的对应--获取⼀条⼀条的记录--释放语句句柄--断开数据库连接 (3)JDBC的思维模式:对象形式执⾏ 建⽴数据连接--创建语句对象--⽤语句对象执⾏SQL,并返回结果对象--从结果对象获取⼀条⼀条记录--提取对象的属性值传给⾼级语⾔变量--释放语句对象--断开数据库连接 (4)嵌⼊式SQL对数据库的访问 ⽤户<-->应⽤程序<-->数据库管理系统<-->操作系统 (5)基于JDBC/ODBC的数据库访问 ⽤户<-->应⽤程序<-->通⽤编程接⼝(ODBC)<-->数据库管理系统<-->操作系统 通⽤编程接⼝:使得不同数据库管理系统可以执⾏同⼀命令。
使用ODBCAPI连接数据库ODBC (Open Database Connectivity) API 是一个为了在不同的应用程序中连接数据库而设计的接口。
它提供了一个标准的方法来访问各种数据库管理系统(DBMS),包括微软的SQL Server、Oracle、MySQL等等。
ODBC API可以让应用程序开发者在不用修改代码的情况下,连接不同的数据库系统。
ODBCAPI的使用可以分为以下几个步骤:1. 安装ODBC驱动程序:首先,在开发机上安装数据库系统对应的ODBC驱动程序。
每个数据库系统都有自己的ODBC驱动程序。
例如,如果要连接MySQL数据库,可以安装MySQL Connector/ODBC驱动程序;如果要连接SQL Server数据库,可以安装SQL Server Native Client驱动程序。
2.配置ODBC数据源:在ODBC数据源管理器中配置ODBC数据源。
数据源是一个指向数据库的连接,它包含了连接数据库所需的信息,如数据库的名称、服务器的地址、登录名和密码等。
可以通过ODBC管理器创建用户数据源(只对当前用户可见)或系统数据源(对所有用户可见)。
3. 连接数据库:在应用程序中使用ODBC API连接数据库。
首先,需要调用`SQLAllocHandle`函数来分配一个ODBC环境句柄、连接句柄和语句句柄。
然后,使用`SQLSetEnvAttr`函数设置环境句柄的属性,如ODBC版本号。
接下来,使用`SQLConnect`函数连接到ODBC数据源。
此时需要提供数据源名称、登录名和密码等信息。
4. 执行SQL语句:连接成功后,就可以使用ODBC API执行SQL语句。
可以使用`SQLPrepare`函数准备SQL语句,然后使用`SQLExecute`函数执行它。
也可以直接使用`SQLExecDirect`函数准备和执行SQL语句。
执行完SQL语句后,可以使用`SQLFetch`函数获取查询结果集中的一行数据。
嵌入式sql 简单名词解释-回复
嵌入式SQL是指在高级语言的源程序中嵌入SQL语句,实现高级语言与SQL语言的混合编程。
这种方式可以使程序员用熟悉的高级语言来编写应用程序的控制部分,而用SQL来处理数据定义和数据操作等与数据库有关的操作。
嵌入式SQL的使用步骤一般如下:
1. 预编译:将包含嵌入式SQL的高级语言源程序进行预编译,生成一个新的源程序。
2. 编译:对预编译后的源程序进行编译,生成目标代码。
3. 连接:将目标代码和数据库管理系统提供的函数库进行连接,生成可执行文件。
嵌入式SQL的优点包括可以充分利用高级语言的功能,提高程序的效率和可读性,同时又能利用SQL的强大功能进行数据库操作。
odbc原理ODBC(Open Database Connectivity)是一种用于数据库访问的标准接口,它提供了一种统一的方式来连接和操作不同数据库管理系统(DBMS)。
本文将介绍ODBC的原理及其在数据库访问中的作用。
一、ODBC的原理ODBC的原理基于客户端/服务器模型,客户端应用程序通过ODBC API(Application Programming Interface)与ODBC驱动程序进行交互,然后驱动程序将请求转发给相应的数据库管理系统(DBMS)进行处理。
ODBC通过使用SQL(Structured Query Language)来访问和操作数据库。
ODBC的核心原理在于提供了一种通用的接口,使得应用程序无需关心底层数据库的细节,只需通过ODBC API来进行数据库操作。
这样,应用程序可以与多种不同的数据库进行交互,而无需修改代码。
二、ODBC的作用1. 提供统一的数据库访问接口:ODBC为应用程序提供了一种统一的接口,使得开发人员可以使用相同的API来访问不同的数据库。
这样,开发人员无需学习和使用不同数据库特定的接口,提高了开发效率。
2. 实现跨平台数据库访问:由于不同数据库管理系统(DBMS)具有不同的API和协议,直接访问不同数据库可能会导致移植性问题。
而ODBC提供了一种跨平台的解决方案,使得应用程序可以在不同操作系统上访问同一种数据库,提高了应用程序的可移植性。
3. 支持多种数据库管理系统:ODBC支持多种不同的数据库管理系统,如Oracle、MySQL、SQL Server等。
这样,开发人员可以选择最适合自己需求的数据库,并且无需改变应用程序的代码。
4. 提供高性能的数据库访问:ODBC驱动程序负责将应用程序的请求转发给底层的数据库,通过优化查询和数据传输等操作,提高了数据库访问的性能。
5. 支持数据的事务处理:ODBC允许应用程序开启和提交事务,保证数据的一致性和完整性。
ODBC的使用实验目的1.熟悉ODBC的配置和使用实验平台1.OS:WindowsXP2.DBMS:SQLServer2000piler:Visual C++ 6.0通过ODBC访问数据库:配置ODBC,为SQL Server添加数据源。
如下图所示:初始化环境:1.把下载Binn+devtools.rar解压到SQLServer的系统目录下(C:\Program Files\Microsoft SQL Server)。
2.初始化Visual C++ 6.0环境。
⏹Tools->options->directories->IncludeFiles: C:\Program Files\Microsoft SQL Server\devtools\include⏹Tools->options->directories->LibFiles:C:\Program Files\Microsoft SQL Server\devtools\x86lib注意:这些路径需要设为第一项。
如下图所示:⏹Project->Settings->Link->Object/Library Modules,添加库文件:SQLakw32.lib Caw32.lib注意,两个文件之间用空格分开。
实验1.对程序odbc.cpp作适当的修改,使之可以在本地系统上可以运行。
进行编译、连接,查看运行结果。
首先配置ODBC,为SQL Server添加数据源,如下图:添加了sqlhw数据源,其配置如下:更改默认数据库为exp之后要在程序中对数据源以及登录ID和密码做修改,修改如下:char* szDSN = "sqlhw";char* szUID = "abc";//log namechar* szAuthStr = "abc";//passward并对SELECT语句做相应的修改,修改为如下查询语句:SElECT sname,city FROM provider where sno='s1'查询结果如下:编写程序,分别使用嵌入式SQL和ODBC调用实现如下的功能:编写程序,创建下列关系表,并插入数据。
实验嵌入式SQL和ODBC的使用实验目的1.熟悉ODBC的配置和使用2.熟悉嵌入式SQL编程3.巩固SQL的知识实验平台1.OS:WindowsXP2.DBMS:SQLServer2000piler:Visual C++ 6.0预备知识1)嵌入式SQL编程:嵌入式SQL由SQL语句和C/C++代码组成。
其中SQL语句由预处理器翻译成C或C++的源代码。
对预处理后的源代码进行编译、连接生成可执行程序后方可运行。
●SQL预处理器SQLServer的预处理程序是nsqlprep.exe。
其常用的语法格式如下:nsqlprep 程序文档名⏹nsqlprep详细的语法格式以及参数意义,请看联机帮助。
经查阅联机帮助,nsqlprep的语法格式如下:nsqlprep program_file_name [/SQLACCESS | /NOSQLACCESS][/FLAGGER {ENTRY | NONE}] [/DB [server_name.]database_name/PASS {login[.password] | $INTEGRATED}] [/BIND file_name][/MSG file_name] [/NOLOGO] [/PLAN name] [/NOLINES][/user_defined_option]⏹要求程序文档名的后缀为.sqc,可以省略。
⏹预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档名同一个路径下nsqlprep.exe在SQLServer的安装目录的MSSQL\Binn下。
在本机中SQLServer的安装目录是C:\Program Files\Microsoft SQL Server,nsqlprep.exe在C:\Program Files\Microsoft SQL Server\MSSQL\Binn。
由于默认的安装方式(典型安装)并没有安装应用程序nsqlprep.exe,因此,需要把本机中E:\院内学习工作\大三\数据库\SQLServer2000个人版\x86\binn目录下的内容拷贝到该目录下。
连接方式经预处理后的c文件就可以用c的编译器进行编译连接了。
使用V isual C++ 6.0进行编译连接,连接方式是动态连接,用到动态链接库SQLakw32.dll,sqlaiw32.dll;此两文件已经随同binn.rar的其他内容,被拷贝到C:\Program Files\Microsoft SQL Server\MSSQL\Binn下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。
方法1:把该两文件拷贝到操作系统目录下的子目录system32中方法2:把C:\Program Files\Microsoft SQL Server\MSSQL\Binn加到系统环境变量path中。
“我的电脑”->“属性”->“高级”->“环境变量”->“path,编辑”,如下图所示:在变量值中加入该路径值;注意,路径间用分号”;”分开。
在实验过程中发现如果只做第二步,在之后的运行过程中会报错,只有将方法一也执行了这个连接的准备工作才算是正式完成。
2)通过ODBC访问数据库:配置ODBC,为SQL Server添加数据源。
如下图所示:初始化环境:1.SQL Server2000为其嵌入式SQL提供了一些特殊的接口;默认的安装方式(典型安装)并没有安装这些接口;因此,需要把devtools.rar解压到SQLServer的系统目录下(注意,不是安装目录);本机是把操作系统安装在C盘,则SQLServer的系统目录则是C:\Program Files\Microsoft SQL Server。
2.初始化SQL Server的预编译环境。
初始化Visual C++ 6.0 编译器环境,运行文件:\Microsoft V isual Studio\VC98\Bin\VCV ARS32.BA T这个过程要在DOS下运行才有效,即找vcvars32.bat的路径,在DOS下运行。
具体步骤如下:⏹初始化SQLServer的预编译环境,运行文件:\devtools\samples\esqlc\setenv.bat。
运行方式与vcvars32.bat相同,结果如下:3.初始化Visual C++ 6.0环境。
⏹Tools->options->directories->IncludeFiles: C:\Program Files\Microsoft SQL Server\devtools\include⏹Tools->options->directories->LibFiles:C:\Program Files\Microsoft SQL Server\devtools\x86lib注意:这些路径需要设为第一项。
如下图所示:⏹Project->Settings->Link->Object/Library Modules,添加库文件:SQLakw32.lib,Caw32.lib注意,两个文件之间用空格分开。
以上部分均在上机课上在师姐的指导下完成。
实验活动1.阅读和分析程序esql.sqc,解释程序的主要内容和主要数据结构。
程序的主要内容:嵌入式SQL的使用,将SQL嵌入到C语言中,在SQL的数据库中通过SELECT 语句获取数据,并将获得的信息通过主变量传递给主语言并打印输出。
给出的程序中将程序连接到WXF的SQL服务器上的pubs数据库上,查询满足以下SELECT语句的数据信息:select EmployeeID from orders where OrderID = 345查询得到的结果由主变量EmployeeID传给主语言(C语言),C语言得到数据信息后打印输出。
程序分为以下几块:1)主变量的声明:在EXEC SQL BEGIN DECLARE SECTION;和EXEC SQL END DECLARESECTION;之间声明主变量EmployeeID。
2)连接到DBMS:连接到数据库的管理系统以便从中查询登陆的数据库。
连接到数据库的语法为:EXEC SQL CONNECT TO SQLServer.DataBaseName USER logName.passwd3)查错:为了更好的判断和查找错误以修改程序,所以在每次执行完SQL语句后都应该对sqlca所返回的状态值加以判断。
若sqlcode等于0,则输出建立成功信息,否则报错。
4)执行查询:在这里嵌入SQL的查询语句EXEC SQL select EmployeeID INTO :EmployeeIDfrom orders where OrderID = 345 ,并通过主变量EmployeeID返回查询到的结果,打印结果。
5)断开所有连接:执行完所有的数据库的访问后,断开所有的连接以释放系统资源。
语法为:EXEC SQL DISCONNECT ALL;数据结构:主要为在数据库中存储的表,及针对表进行的查找。
2.对程序esql.sqc作适当的修改,使之可以在本地系统上可以运行。
进行预处理、编译、连接(lib连接),查看运行结果。
1)修改:只需要对连接的服务器及数据库进行修改即可:EXEC SQL CONNECT TO SKY.pubs USER abc.abc;同时由于pubs数据库中没有orders表,所以对SELECT语句也作了修改如下:EXEC SQL select emp_id INTO :EmployeeID from employee where lname = 'Accorti';2)进行预处理:将esql.sqc文件放在C:\Program Files\Microsoft SQL Server\MSSQL\Binn目录下,运行cmd,进入C:\Program Files\Microsoft SQL Server\MSSQL\Binn目录,用nsqlprep esql.sqc的方式运行该文件,可以在C:\Program Files\Microsoft SQL Server\MSSQL\Binn中找到预编译后生成的.c文件。
运行过程显示如下:3)连接操作已经在前面的初始化环境过程中完成。
运行结果如下:不知为什么,在黄伟的机子上运行时,不管怎么换查询条件,结果总是0但是在田超的机子上运行的时候,就能够得出正确结果。
田超查询的是Northwind 数据库中的orders表,语句为EXEC SQL select EmployeeID INTO :EmployeeID from orders where OrderID = 10248 ;运行结果如下:经反复实验,首先排除了黄伟机子的问题,因为在田超的机器上运行也是0。
于是又开始怀疑是数据库的问题。
首先在程序中打印出了sqlcode,如图:看到sqlcode<0,说明这个语句没有被执行。
开始以为是用户没有访问数据库的权限的问题,但是发现把用户改成sa,把默认数据库改为pubs依然存在这个问题。
将田超的sqc文件和黄伟的放在一起比较,最终发现原来是因为pubs数据库中emp_id 的数据类型是empid,而在c中定义的主变量是int型,两者类型不匹配,造成了错误。
黄伟机子上的正确结果:4)出现的怪异问题:尽管之前的准备步骤都已经全部做完,但是在预编译时总是会出现以下问题,每次都要重新把安装文件下的BIN和DEVTOOLS重新拷一遍到C盘SQLSERVER相应得路径下,然后再在DOS下运行setenv.bat和vcvars32.bat两个文件才能解决这个问题,有时甚至所有步骤都要重新做一次。
不明白这是什么原因。
我们在网上查到.bat格式的文件是批处理文件,它在日常的应用中可以发挥巨大的作用,但批处理命令执行的效率比较低,而且不小心会把里面的命令破坏掉。
所以不知是不是因为.bat的稳定性不好。
思考:sqlca结构中主要的数据项有哪些?我们常用的有哪些?sqlca是一个含有错误变量和状态指示符的数据结构。
通过检查sqlca,应用程序能够检查出嵌入式SQL语句是否成功,并根据成功与否决定是否继续往下执行。
与编译器自动在嵌入SQL语句中包含SQLCA数据结构。
从联机帮助上我们可以找到,SQLCA结构中主要的数据项如下(用结构体表示):在SQLCA中我们经常用到的是sqlcode,它用来记录最近执行的SQL状态:"0" :表示该SQL语句被正确执行,无错误发生>0 :表示执行了该语句,但遇到了错误<0 :表示由于数据库、系统、网络或应用程序错误等等原因未执行该语句SQL操作的常见的错误类型有哪些?如何得到错误信息?举例说明SQL中常见的错误类型有:通过下面的这些返回值,可以得到相应的出错信息。