北邮大三数据库实验七报告.docx
《北邮大三数据库实验七报告.docx》由会员分享,可在线阅读,更多相关《北邮大三数据库实验七报告.docx(12页珍藏版)》请在冰豆网上搜索。
北邮大三数据库实验七报告
《数据库原理》实验报告
实验名称数据库接口实验
班级2011211307
组号07组
组员姓名丁雪(2011211293,2)周伦(2011211299,8)
实验七数据库接口实验
一、实验目的
1.通过编写数据库应用程序,培养数据库应用程序开发能力。
2.熟悉数据库应用程序设计的多种接口的配置,培养相关的软件配置能力。
二、实验环境
采用MicrosoftSQLServer数据库管理系统作为实验平台。
三、实验内容与步骤
实验内容:
1.了解通用数据库应用编程接口(例如JDBC、ODBC等)的配置方法。
2.利用C语言(或其它支持某种数据库应用程序接口的高级程序设计语言)编程实现简单的数据库应用程序,掌握基于该接口的数据库访问的基本原理和方法。
3.掌握静态嵌入式SQL语言程序设计的原理和方法。
4.在数据库应用程序中,执行查找、增加、删除、更新等操作。
5.选择适当的数据访问接口,比较高的要求为完成静态和动态嵌入式SQL的程序设计(需要两个程序),基本要求为两者选择其一。
实验步骤:
1.实验准备:
以教科书第四章关于SQL语言相关内容为基础,课后查阅、自学ODBC/JDBC等接口有关内容,包括体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法等。
(1)应用程序使用ODBC接口的详细步骤
1)分配环境句柄:
ODBC初始化,为ODBC分配环境句柄。
声明一个SQLHENV的变量,调用函数SQLAllocHandle。
设置环境属性:
完成环境分配后,用函数SQLSetEnvAttr设置环境属性,注册ODBC 版本号。
释放环境句柄:
完成数据访问任务时,应调用SQLFreeHandle释放前面分配的环境。
2)分配连接句柄:
声明一个SQLHDBC类型的变量,调用SQLAllocHandle函数分配句柄。
设置连接属性:
所有连接属性都可通过函数SQLSetConnectAttr设置,调用函数SQLGetConnectAttr可获取这些连接属性的当前设置值。
3)连接数据源:
对于不同的程序和用户接口,可以用不同的函数建立连接。
SQLConnect:
该函数只要提供数据源名称、用户ID和口令,就可以进行连接了。
SQLDriverConnect:
该函数用一个连接字符串建立至数据源的连接,它可以让用户输入必要的连接信息,使用系统中还没定义的数据源。
SQLBrowseConnect:
该函数支持以一种迭代的方式获取到数据源的连接,直到最后建立连接,它基于客户机/服务器体系结构,因此本地数据库不支持该函数。
4)准备并执行SQL语句
a)分配语句句柄:
语句句柄是通过调用SQLAllocHandle函数分配的。
函数SQLGetStmrrAttr和SQLSetStmrrAttr用来获取和设置一个语句句柄的选项,使用完,调用SQLFreeHandle释放该句柄。
b)执行SQL语句
SQLExecDirect:
该函数直接执行SQL语句,对于只执行一次的SQL语句来说,该函数是执行最快的方法。
SQLPrepare和SQLExecute:
对于需要多次执行的SQL语句来说,可先调用SQLPrepare准备SQL语句的执行,用SQLExecute执行准备好的语句。
c)使用参数:
使用参数可以使一条SQL语句多次执行,得到不同的结果。
函数SQLBindParameter负责为参数定义变量,实现参数值的传递。
5)获取记录集
a)绑定列:
首先必须分配与记录集中字段相对应的变量,然后通过函数SQLBindCol将记录字段同程序变量绑定在一起,对于长记录字段,可以通过调用函数SQLGetData直接取回数据。
绑定字段可以根据自己的需要全部绑定,也可以绑定其中的某几个字段。
通过调用函数SQLBindCol将变量地址值赋为NULL,可以结束对一个记录字段的绑定,通过调用函数SQLFreeStmt,将其中选项设为SQL_UNBIND,或者直接释放句柄,都会结束所有记录字段的绑定。
b)SQLFetch:
该函数用于将记录集的下一行变成当前行,并把所有捆绑过的数据字段的数据拷贝到相应的缓冲区。
c)光标:
应用程序获取数据是通过光标(Cursor)来实现的,在ODBC中,主要有3种类型的光标:
单向光标、可滚动光标和块光标。
有些应用程序不支持可滚动光标和块光标,ODBCSDK提供了一个光标库(ODBCCR32.DLL),在应用程序中可通过设置连接属性(SQL_STTR_ODBC_CURSOR)激活光标库。
6)记录的添加、删除和更新:
数据源数据更新可通过3种方式:
通过SQLExecDirect函数使用相应的SQL语句;调用SQLSetPos函数实现记录集定义更新;调用SQLBulkOperations函数实现数据更新。
第一种方式适用于任何ODBC数据源,后两种方式有的数据源不支持,可调用SQLGetInfo确定数据源。
SQLBulkOperations:
该函数操作基于当前行集,调用前,须先调用SQLFetch或SQLFetchScroll获取。
函数调用后,块光标的位置变为未定义状况,因此,应该先调用函数SQLFetchScroll设定光标位置。
7)错误处理:
每个ODBCAPI函数都能产生一系列反映操作信息的诊断记录,可以用SQLGetDiagField函数获取诊断记录中特定的域,另外,可以使用SQLGetDiagRec获取诊断记录中一些常用的域。
8)事务处理:
事务提交有两种方式:
自动提交模式和手动提交模式。
应用程序可通过调用函数SQLSetConnectAttr设定连接属性SQL_ATTR_AUTOCOMMIT,自动提交模式是默认的连接属性设置,对于所有的ODBC驱动程序都能适应这种模式下,所有语句都是作为一个独立的事务进行处理的。
手动提交模式把一组SQL语句放入一个事务中,程序必须调用函数SQLEenTran明确地终止一个事务。
若使用多个激活的事务,就必须建立多个连接,每一个连接包含一个事务。
9)断开数据连接并释放环境句柄:
完成数据库操作后,可调用SQLDisconnect函数关闭同数据库的连接。
(2)ODBCAPI函数介绍
1)functionintegerSQLAllocEnv(reflongphenv)library"odbc32.dll"
参数:
reflongphenv引用传递的long类型参数,保存该函数返回的OBDC环境的句柄。
存放在phenv中的值成为以后OBDCAPI函数调用的唯一标识符。
返回值:
integer成功时,返回0,失败返回值小于0。
函数功能:
获取ODBC环境句柄。
2)functionintegerSQLAllocStmt(longhdbc,reflonghstmt)library"odbc32.dll"
参数:
longhdbcODBC环境的句柄。
Reflonghstmt保存SQL语句句柄。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
获取SQL语句句柄。
3)functionintegerSQLConnect(longhstmt,refstringszdsn,integerdsnlen,refstringszuid,integeruidlen,refstringszpwd,integerpwdlen)library"odbc32.dll"
参数:
longhstmt调用SQLAllocStmt()函数获取的句柄;Refstringszdsn ODBC数据源名;IntegerdsnlenODBC数据源名的长度;Refstringszuid用户帐号;Integeruidlen用户帐号长度;Refstringszpwd用户口令。
Refintegerpwdlen 用户口令长度。
返回值:
integer,成功时,返回值大于0,失败返回值小于0。
函数功能:
连接ODBC数据源,并返回连接句柄。
4)functionintegerSQLDisconnect(longhdbc)library"odbc32.dll"
参数:
longhdbc连接句柄。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
断开连接ODBC数据源。
5)functionintegerSQLTables(longhstmt,refstringsztablequalifier,integertablequalifierlen,refstringszowner,integerowerlen,refstringszname,integernamelen,refstringsztype,integertypelen)library"odbc32.dll"
参数:
longhstmtSQL语句句柄;refstringsztablequalifier表的qualifier名;integertablequalifierlen表的qualifier名的长度;refstringszowner表的所有者名;integerowerlen表的所有者名长度;refstringszname表名;integernamelen表名长度;refstringsztype表的类型名;integertypelen表的类型名长度。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
获取表的信息。
6)functionintegerSQLColumns(longhstmt,refstringsztablequalifier,integertablequalifierlen,refstringszowner,integerowerlen,refstringszname,integernamelen,refstringsztype,integertypelen)library"odbc32.dll"
参数:
longhstmtSQL语句句柄;refstringsztablequalifier表的qualifier名;integertablequalifierlen表的qualifier名的长度;refstringszowner表的所有者名;integerowerlen表的所有者名长度;refstringszname表名;integernamelen表名长度;refstringsztype表的类型名;integertypelen表的类型名长度。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
获取指定表的列信息。
7)functionintegerSQLBindCol(longhstmt,integercolnum,integerdatatype,refstringname,longmaxlen,reflongactlen)library"odbc32.dll"
参数:
longhstmtSQL语句句柄;integercolnum1-5(是否有资格,拥有者名字、类型、注释;integerdatatype1-8,12,99;refstringname程序字符串变量;longmaxlen可变;reflongactlen可变;
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
绑定结果集。
8)functionintegerSQLFetch(longhstmt)library"odbc32.dll"
参数:
longhstmtSQL语句句柄。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
绑定结果集。
9)functionintegerSQLError(longlenv,longhdbc,longhstmt,refstringsqlstate,reflongnativeerror,refstringerrormsg,integererrormsgmax,refintegererrormsglen)library"odbc32.dll"
参数:
longlenvODBC环境句柄;longhdbc连接句柄;longhstmtsql语句句柄;refstringsqlstate用于接受包含sql错误标识的字符串;reflongnativeerror用于接受包含sql错误标识码;refstringerrormsg用于接受包含sql错误信息的字符串;integererrormsgmax函数返回的最多字符数;refintegererrormsglen函数返回的实际字符数。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
返回调用ODBCAPI函数错误。
10)functionintegerSQLFreeEnv(longhenv)library"odbc32.dll"
参数:
longlenvODBC环境句柄。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
释放ODBC环境句柄。
11)functionintegerSQLFreeStmt(longhstmt,integerOptions)library"odbc32.dll"
参数:
longhstmtSQL语句句柄;integerOptions相关选项。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
释放SQL语句句柄。
12)functionintegerSQLDataSources(longhenv,intfdirection,refstringszdsn,integercbdsnmax,refintegerpcbdsn,refstringszdescription,integercbdescriptionmax,refintegerpcbdescription)library"odbc32.dll"
参数:
longhenvODBC数据源环境句柄;intfdirection方向标志1(下一个),2(第一个),3(最后一个),4(前一个);refstringszdsn数据源名称;integercbdsnmax数据源名称的最大长度;refintegerpcbdsn数据源名称的实际长度;refstringszdescription数据源描述名称;integercbdescriptionmax数据源描述字符串的最大长度;refintegerpcbdescription数据源描述字符串的实际长度。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
释放SQL语句句柄。
13)functionintegerSQLAllocConnect(longhenv,reflonghdbc)library"odbc32.dll"
参数:
longhenvODBC数据源环境句柄;reflonghdbc保存ODBC连接句柄。
返回值:
integer,成功时,返回0,失败返回值小于0。
函数功能:
获取ODBC连接句柄。
2.
在Windows控制面板中通过管理工具下的ODBC数据源工具在客户端新建连接到SQLSERVER数据库服务器的ODBC数据源,测试连接通过后保存,注意名字要和应用程序中引用的数据源一样。
另外要注意创建ODBC数据源时使用的驱动程序必须是支持SQLSERVER的,而不可选择其它驱动程序。
3.以实验二建立的数据库为基础,编写C语言(或其它支持ODBC/JDBC等接口的高级程序设计语言)数据库应用程序,利用SQLExecDirect语句,实现数据库应用程序对数据库中表(有数据)进行数据查询、删除、插入、更新等操作。
要求先打印出所有记录,然后删除一行,再打印一次,进行更新,再打印一次,最后插入,再打印一次。
注意:
SQLSERVER应设置为应用程序可以访问。
源代码如下:
#include
#include
#include
#include"sql.h"
#include"sqltypes.h"
#include"sqlext.h"
voidquery();
voidsql(charsql[]);
RETCODEerror;
SQLHDBCconn;
HSTMTstmt;
intmain()
{
SQLHANDLEenv;
charDB[]="GSM";
charUSER[]="sa";
charKEY[]="123";
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&env);
SQLSetEnvAttr(env,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
SQLAllocHandle(SQL_HANDLE_DBC,env,&conn);
SQLConnect(conn,(SQLCHAR*)DB,SQL_NTS,(SQLCHAR*)USER,SQL_NTS,(SQLCHAR*)KEY,SQL_NTS);
//printf("%d\n",error);
printf("select*fromMSC\n");
query();
charsqlinsert[]="insertintoMSCvalues(2222,'AAAA','BBBB',121.121,111.111,100)";
printf("insertintoMSCvalues(2222,'AAAA','BBBB',121.121,111.111,100)\n");
sql(sqlinsert);
query();
charsqlupdate[]="updateMSCsetMscAltitude=200whereMscID=2222";
printf("updateMSCsetMscAltitude=200whereMscID=2222\n");
sql(sqlupdate);
query();
charsqldelete[]="deletefromMSCwhereMscID=2222";
printf("deletefromMSCwhereMscID=2222\n");
sql(sqldelete);
query();
SQLDisconnect(conn);
SQLFreeConnect(conn);
SQLFreeEnv(env);
system("pause");
return0;
}
voidquery()
{
charsqlquery[]="select*fromMSC";
charMscID[20],MscName[20],MscCompany[20],MscLongitude[20],MscLatitude[20],MscAltitude[20];
longlenOut1,lenOut2,lenOut3,lenOut4,lenOut5,lenOut6;
SQLAllocStmt(conn,&stmt);
error=SQLExecDirect(stmt,(SQLCHAR*)sqlquery,SQL_NTS);
if(error==SQL_SUCCESS||error==SQL_SUCCESS_WITH_INFO)
{
SQLBindCol(stmt,1,SQL_C_CHAR,MscID,sizeof(MscID),&lenOut1);
SQLBindCol(stmt,2,SQL_C_CHAR,MscName,sizeof(MscName),&lenOut2);
SQLBindCol(stmt,3,SQL_C_CHAR,MscCompany,sizeof(MscCompany),&lenOut3);
SQLBindCol(stmt,4,SQL_C_CHAR,MscLongitude,sizeof(MscLongitude),&lenOut4);
SQLBindCol(stmt,5,SQL_C_CHAR,MscLatitude,sizeof(MscLatitude),&lenOut5);
SQLBindCol(stmt,6,SQL_C_CHAR,MscAltitude,sizeof(MscAltitude),&lenOut6);
error=SQLFetch(stmt);
while(error==SQL_SUCCESS||error==SQL_SUCCESS_WITH_INFO)
{
printf("%-8s%-3s%-3s%-20s%-20s%-20s%\n",MscID,MscName,MscCompany,MscLongitude,MscLatitude,MscAltitude);
error=SQLFetch(stmt);
}
printf("\n");
}
SQLFreeStmt(stmt,SQL_DROP);
}
voidsql(charsql[])
{
error=SQLAllocStmt(conn,&stmt);
if(error==SQL_SUCCESS||error==SQL_SUCCESS_WITH_INFO){
SQLExecDirect(stmt,(SQLCHAR*)sql,SQL_NTS);
}
SQLFreeStmt(stmt,SQL_DROP);
}
执行效果如下:
我们可以看到,(2222,‘AAAA’,‘BBBB’,121.121,111.111,100)这样一条数据先被添加,然后被更新,然后被删除
四、实验总结