北邮大三数据库实验七报告.docx

上传人:b****5 文档编号:11756360 上传时间:2023-03-31 格式:DOCX 页数:12 大小:277.30KB
下载 相关 举报
北邮大三数据库实验七报告.docx_第1页
第1页 / 共12页
北邮大三数据库实验七报告.docx_第2页
第2页 / 共12页
北邮大三数据库实验七报告.docx_第3页
第3页 / 共12页
北邮大三数据库实验七报告.docx_第4页
第4页 / 共12页
北邮大三数据库实验七报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

北邮大三数据库实验七报告.docx

《北邮大三数据库实验七报告.docx》由会员分享,可在线阅读,更多相关《北邮大三数据库实验七报告.docx(12页珍藏版)》请在冰豆网上搜索。

北邮大三数据库实验七报告.docx

北邮大三数据库实验七报告

《数据库原理》实验报告

实验名称数据库接口实验

班级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)这样一条数据先被添加,然后被更新,然后被删除

四、实验总结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1