实验五嵌入式SQL和ODBC的使用.doc_第1页
实验五嵌入式SQL和ODBC的使用.doc_第2页
实验五嵌入式SQL和ODBC的使用.doc_第3页
实验五嵌入式SQL和ODBC的使用.doc_第4页
实验五嵌入式SQL和ODBC的使用.doc_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验3-3 嵌入式SQL和ODBC的使用 03CS_313110_45+60_曹玉瑾、周燕红一、实验目的1. 熟悉ODBC的配置和使用2. 熟悉嵌入式SQL编程3. 巩固SQL的知识二、实验平台1. OS:Windows2000/XP2. DBMS:SQLServer2000KingBase(可选)3. Compiler:Visual C+ 6.0三、实验活动前的准备 以下的实验前准备工作都是参考是实验要求中的实验预备知识进行的,在此没有给出做一下动作的原因及相关的一些知识,仅仅是给出了我们具体的一些活动。(1)嵌入式SQL编程:、SQL预处理器由于我们的SQLServer的安装目录是C:Program FilesMicrosoft SQL ServerMSSQL因此,需要把安装文件中的文件夹binn的内容拷贝到该目录下覆盖原有的binn的全部内容。拷贝前必须关于有关SQL的所有进程,否则拷贝将无法成功进行。、连接方式为了使经预处理后的c文件就以用c的编译器进行编译连接,我们需要使用Visual C+ 6.0进行编译连接,连接方式是动态连接,这就需要用到动态链接库SQLakw32.dll,sqlaiw32.dll;此两文件已经随同binn.rar的其他内容,被拷贝到C:Program FilesMicrosoft SQL ServerMSSQLBinn下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。方法1:把该两文件拷贝到操作系统目录下的子目录system32中我们使用的就是方法1。方法2:把D:Program FilesMicrosoft SQL ServerMSSQLBinn加到系统环境变量path中。“我的电脑”-“属性”-“高级”-“环境变量”-“path,编辑”,如下图所示:在变量值中加入该路径值;注意,路径间用分号”;”分开。、创建一个用户,以方便实验活动中中使用嵌入式SQL编程。在SQL Server的pubs数据库下,添加用户yjc,其密码为:yjc,并将该用户的角色同时设为public与db_owner,这样就允许我们在程序中访问该数据库,并做一定的操作。(2)通过ODBC访问数据库:、配置ODBC,为SQL Server添加数据源。 过程如下: 打开运行,输入命令“odbcad32.exe”,如下图所示:探出窗口如下图所示: 点击右侧的“添加”,选择SQL SERVER,如下图示: 在新出窗口中,输入数据源的名称,如“lanxin”,并选择本地服务器,如下图示: 点击下一步,如下图: 在新弹出窗口中,更改默认的数据库为“cryone” (该数据库中表S、P、J、SPJ),如下图所示: 接下来的就点击完成。无需特殊的选择,最后点击确定,如下图: 、创建一个用户,以方便实验活动中中使用ODBC编程。在SQL Server的cryone数据库下(该数据库中含有上次实验创建的表S、P、J、SPJ),添加用户lanxin,其密码为:lanxin,并将该用户的角色同时设为public与db_owner,这样就允许我们在程序中访问该数据库,并做一定的操作。(3)初始化环境:1 SQL Server2000为其嵌入式SQL提供了一些特殊的接口;默认的安装方式(典型安装)并没有安装这些接口;因此,需要把devtools.rar解压到SQLServer的系统目录下(注意,不是安装目录);例如操作系统安装在C盘,则SQLServer的系统目录则是C:Program FilesMicrosoft SQL Server。后面的设置,假设操作系统安装在C盘。2 初始化SQL Server的预编译环境。n 初始化Visual C+ 6.0 编译器环境,运行文件:Microsoft Visual StudioVC98BinVCVARS32.BATn 初始化SQLServer的预编译环境,运行文件:devtoolssamplesesqlcsetenv.bat。3 初始化Visual C+ 6.0环境。n Tools-options-directories-Include Files: C:Program FilesMicrosoft SQL Serverdevtoolsincluden Tools-options-directories-LibFiles:C:Program FilesMicrosoft SQL Serverdevtoolsx86lib注意:这些路径需要设为第一项。如下图所示:n Project-Settings-Link-Object/Library Modules,添加库文件:SQLakw32.lib Caw32.lib注意,两个文件之间用空格分开。四、实验活动实验活动要求:1. 对以下的程序,要求调试成功,并在上机过程中演示2. 分析嵌入式SQL和ODBC编程的主要结构(例如对ODBC的使用,先allocate environment,后allocate ODBC connection等)。3. 记录实验过程,并对各活动(包括错误活动)作分析说明(1)阅读和分析程序esql.sqc,解释程序的主要内容和主要数据结构。 A、打开文件esql.sqc,首先大概得浏览该程序可以看到嵌入式SQL编程的主要结构为: 说明主变量,其中主变量的定义必须放在以下两条说明性语句之间:EXEC SQL BEGIN DECLARE SECTION;EXEC SQL END DECLARE SECTION 连接数据库,语法的格式为:EXEC SQL CONNECT TO SQLServer.DataBaseName USER logName.passwd对数据库进行相关操作,如作查询,语句格式为:EXEC SQL select 属性列名 INTO :主变量 from 表名 WHERE 条件 ; 出错处理,语句格式为:EXEC SQL WHENEVER SQLERROR GOTO 出错处理段; 程序最后要断开通数据库的连接:EXEC SQL DISCONNECT ALL; B、进一步仔细分析程序esql.sqc,可以看到该程序的主要实现的内容以及程序中的使用的数据结构为: 定义一个主变量“EmployeeID”,在该程序中,就是通过了这个主变量来实现C语言同数据库的通信的,而主变量的声明由以下的说明性语句中来说明: EXEC SQL BEGIN DECLARE SECTION;int EmployeeID = 0; EXEC SQL END DECLARE SECTION; 打印出该程序的功能信息,即该程序是一个面向C语言编程的嵌入式SQL的范例,而在该程序中是以下语句说明了这一点: printf(Sample Embedded SQL for C applicationn); 在该程序运行的环境下,尝试连接到SQL的数据库管理系统,同时也对连接是否正确作了一定的判断,若正确,则返回“建立连接”的信息,提示该程序可以使用嵌入式语句对数据库进行访问,并返回查询结果以供C语言处理,若连接部正确则属错“连接失败”信息,并且结束该程序。 具体实现语句如下:EXEC SQL CONNECT TO WXF.pubs USER sa.sql; if (SQLCODE = 0) printf(Connection to SQL Server establishedn); else printf(ERROR: Connection to SQL Server failedn); return (1); 在连接到数据库以后,执行查询语句,查找出订单的ID为345的员工的ID号,并存放在主变量EmployeeID中。具体实现语句如下:EXEC SQL select EmployeeID INTO :EmployeeID from orders where OrderID = 345 ; 当使用嵌入式SQL语句同数据库打交道时,如果发生错误,则对该错误作适当的处理,该程序中做的错误处理方式就是断开与数据库的连接。如下两个语句来实现: EXEC SQL WHENEVER SQLERROR GOTO error;error:EXEC SQL DISCONNECT ALL; 打印出查询结果:printf(EmployeeId Result is: %dn,EmployeeID);(2)对程序esql.sqc作适当的修改,使之可以在本地系统上可以运行。进行预处理、编译、连接(lib连接),查看运行结果。A、修改之后的esql.sqc内容如下(其中修改的部分用蓝色标识):#include #include int main() EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION;/主变量int EmployeeID = 0; EXEC SQL END DECLARE SECTION; printf(Sample Embedded SQL for C applicationn); /尝试连接到DBMS上 EXEC SQL CONNECT TO LENOVO-95F59392.pubs USER yjc.yjc; if (SQLCODE = 0) printf(Connection to SQL Server establishedn); else / 连接DBMS错误 printf(ERROR: Connection to SQL Server failedn); return (1); /执行查询语句,把结果放到主变量EmployeeID中EXEC SQL select EmployeeID INTO :EmployeeID from orders where OrderID = 345 ;EXEC SQL WHENEVER SQLERROR GOTO error;/打印结果printf(EmployeeId Result is: %dn,EmployeeID);error:/断开连接 EXEC SQL DISCONNECT ALL; return (0); B、将修改之后的esql.sqc拷贝到目录C:Program FilesMicrosoft SQL ServerMSSQLBinn下面(这是必需的,否则预编译无法成功,具体原因我们也不是很清楚),打开DOS命令,在路径C:Program FilesMicrosoft SQL ServerMSSQLBinn下输入命令如下:执行后,便会在目录C:Program FilesMicrosoft SQL ServerMSSQLBinn下生成了文件esql.cC、打开文件esql.c,执行该文件后的结果为:因为不存在employeeID=345的元组,所以返回结果为0。D、 思考:1、 sqlca结构中主要的数据项有哪些?我们常用的有哪些?答:sqlca是一个结构类型的变量,它是数据库和应用程序的一个接口。在执行程序时, SQL Server把每一个嵌入SQL语句执行的状态信息存入SQLCA中, 根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示:Struct sqlca unsigned char ;char sqlcaid EYECATCH_LEN ; -标识通讯区 long sqlabc; - 通讯区的长度long sqlcode; -保留最近执行的SQL语句的状态码struct unsigned short sqlerrml; -信息文本长度sqlerrm;char sqlerrp 8 ; / Diagnostic informationlong sqlerrd 6 ; / Diagnostic informationchar sqlwarn 8 ; / Warning flagschar sqlext 8 ; / Reservedunsigned char sqlstate5; / new member每个数据项的具体说明如下:Here are fields and data types for the sqlca data structure.FieldC data typeContainssqlcaidunsigned charText string SQLCA.sqlabclongLength of the SQLCA data structure.sqlcodelongStatus code for the last-run SQL statement: 0The statement ran without error.1The statement ran, but an exception was generated.100A FETCH statement was issued, but no more rows satisfy the SELECT statement criteria used to define the cursor. No rows were processed. 0: 系统执行了该语句,但遇到一个例外(如没找到任何数据)。0:表示由于数据库、系统、网络或应用程序的错误,系统未执行该SQL语句。当出现此类错误时,当前事务一般应回滚。2、 SQL操作的常见的错误类型有哪些?如何得到错误信息?如何处理SQL操作的错误信息?答:SQL操作中的错误和消息会在sqlca 数据结构中返回到应用程序。Microsoft SQL Server 消息各部分将映射到 sqlca数据结构的各字段中:sqlerrmc包含错误信息文本;sqlerrd1包含 SQL Server错误号;sqlerrd2包含 SQL Server 严重级别;Sqlstate:包含 SQLSTATE 运行时错误代码,在用于 C 语言的嵌入式 SQL 中定义。这些 SQLSTATE 代码与 SQL Server 消息的任何部分都不相关。出错时一般是跳入错误处理阶段,如上述程序esql.sqc中的:error: /断开连接 EXEC SQL DISCONNECT ALL; 在该程序中,它的错误处理方法是断开所有连接。当然可以根据不同的需求,做相应的错误处理。3、 如何断开连接,并释放资源清除环境?建议尝试程序esql.sqc的方法以外的别的方法。注意记录实验活动过程,并作适当的分析 答:以上述程序esql.sqc为例,它使用了语句:EXEC SQL DISCONNECT ALL;来断开与数据库的连接,并释放其资源环境。 我们认为,如果没有上述断开连接的语句,当我们的程序结束时,系统会自动断开同数据库的连接,同时释放程序中曾经占有的资源。(3)阅读和分析程序odbc.cpp,解释程序的主要内容和主要数据结构。A、 打开文件odbc.cpp,首先大概得浏览该程序可以看到一般情况下,使用ODBC编程的主要结构为: Allocate the ODBC Environment and save handle,其语句格式如下:SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);Notify the ODBC VERSION,语句的格式为:SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); Allocate an ODBC connection and connect,语句的格式为: SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);通过用户名及其密码连接到指定的数据库,语句格式为: char* szDSN = ODBC数据源的名称;char* szUID = log name;char* szAuthStr = passward;SQLConnect(hdbc1, (SQLCHAR*)szDSN, (SWORD)strlen(szDSN),(SQLCHAR*)szUID, (SWORD)strlen(szUID),(SQLCHAR*)szAuthStr, (SWORD)strlen(szAuthStr); Allocate a statement handle,其语句格式: SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1); Execute an SQL statement directly on the statement handle,其语句格式:SQLExecDirect(hstmt1,(SQLCHAR*)SQL语句, SQL_NTS); 如果执行的SQL语句是查询语句,则还应包含查询结果的处理,通过SQLBindCol把某个结果属性列绑定到变量上,这种方式,每次只能绑定一个属性列;只须绑定一次,就可以多次使用;绑定之后,通过SQLFetch来缓冲区中current tuple对应的值拷贝到变量中;同时,SQLFectch把下一个元组置为current tuple,并且使用 SQL_NO_DATA指示到达结果缓冲末尾。此外 也可以通过SQLGetData来读取数据程序结束时的清空处理,例如:SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);SQLDisconnect(hdbc1);SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);SQLFreeHandle(SQL_HANDLE_ENV, henv); B、进一步仔细分析该程序odbc.cpp,总的来看,该程序的功能是由main函数来实现的,此外main函数中比较特别的地方就是使用了预编译指令,如开头的宏定义“#define SQLBINDCOL”就同程序中的以下指令及相关语句:#ifdef SQLBINDCOL#else#endif它们是共同来实现程序过程中部分编译的功能的。下面就分别详细的分析该程序中的主要内容及其数据结构:主函数main之前首先除了包含一些投文件以外,还给出了程序中要使用的宏定义:#define MAXBUFLEN 255缓冲区的最大长度#define MaxNameLen 20 定义变量时的最大长度 #define SQLBINDCOL 为后面的编译指令提供入口条件 主函数main之前,还声明一些全局变量:SQLHENV henv = SQL_NULL_HENV;SQLHDBC hdbc1 = SQL_NULL_HDBC; SQLHSTMT hstmt1 = SQL_NULL_HSTMT; 主函数main部分,首先定义了程序中用到的一个中间变量:RETCODE retcode;使用ODBC编程的预处理过程,如包括导入环境参数,确认版本类型,倒入连接等,每个步骤后,都做了错误判断:/ Allocate the ODBC Environment and save handle.retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);if(retcode 0 )coutallocate ODBC Environment handle errors.endl;return -1;/ Notify ODBC that this is an ODBC 3.0 application.retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);if(retcode 0 )coutthe ODBC is not version3.0 endl;return -1;/ Allocate an ODBC connection and connect.retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);if(retcode 0 )coutallocate ODBC connection handle errors.endl;return -1;使用某一ODBC数据源所连接的数据库的用户名及密码尝试连接到该数据库,以便后续的查询能顺利进行。如果失败了,就输出连接错误的信息,否则继续后面的工作。/Data Source Name must be of type User DNS or System DNSchar* szDSN = sqlserver;char* szUID = wxf;/log namechar* szAuthStr = wxf;/passward/connect to the Data Sourceretcode=SQLConnect(hdbc1,(SQLCHAR*)szDSN,(SWORD)strlen(szDSN),(SQLCHAR*)szUID, (SWORD)strlen(szUID),(SQLCHAR*)szAuthStr, (SWORD)strlen(szAuthStr);if(retcode 0 )coutconnect to ODBC datasource errors.endl;return -1;导入一个statement handle,并也同时做了错误判断,出错就打印“导入错误”的信息,并返回程序,否则继续程序,即在该控制柄上执行一个查询语句:即查询出表s中的供应商号码不是s1的供应商姓名及所在的城市:/ Allocate a statement handle.retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);if(retcode 0 )coutallocate ODBC statement handle errors.endl;return -1;/ Execute an SQL statement directly on the statement handle.retcode = SQLExecDirect(hstmt1,(SQLCHAR*)SElECT sname,city FROM s WHERE sno!= s1, SQL_NTS);if(retcode 0 )coutExecuting statement throught ODBC errors.endl;return -1;处理查询结果的准备工作,定义存放查询结果的变量供应商的姓名及城市:/ SQLBindCol variablesSQLCHAR cityMaxNameLen + 1;SQLCHAR nameMaxNameLen + 1;SQLINTEGER columnLen = 0;/数据库定义中该属性列的长度输出查询结果:如输出name的信息主要使用了以下语句:retcode = SQLBindCol(hstmt1, 1, SQL_C_CHAR,name,MaxNameLen , &columnLen);while ( (retcode = SQLFetch(hstmt1) ) != SQL_NO_DATA ) printf(name = %sn, name);而输出city的信息则使用了一下语句: while(1 )retcode = SQLFetch(hstmt1);if(retcode = SQL_NO_DATA)break;retcode = SQLGetData(hstmt1, 2, SQL_C_CHAR, city, MaxNameLen, &columnLen);printf(city = %sn, city);程序结束的收尾处理,将程序定义的变量释放:/* Clean up.*/SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);SQLDisconnect(hdbc1);SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);SQLFreeHandle(SQL_HANDLE_ENV, henv);(4)对程序odbc.cpp作适当的修改,使之可以在本地系统上可以运行。进行编译、连接,查看运行结果。由于在实验活动前预备中,我们已经配置了ODBC数据源,名称为:lanxin,它连接到SQL SERVER中的cryone数据库(该数据库中含有上次实验创建的表S、P、J、SPJ),此外还在该数据库中添加了新用户名为:lanxin,密码为:lanxin,并将该用户的角色同时设为public与db_owner,这样就允许我们在程序中访问该数据库,并做一定的操作。例如,cryone数据库表S的内容为:A、将程序odbc.cpp修改为,其中修改的部分用蓝色标识:#include #include #include #include #include #include #include #define MAXBUFLEN 255#define MaxNameLen 20SQLHENV henv = SQL_NULL_HENV;SQLHDBC hdbc1 = SQL_NULL_HDBC; SQLHSTMT hstmt1 = SQL_NULL_HSTMT;int main() RETCODE retcode; / Allocate the ODBC Environment and save handle.retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);if(retcode 0 )coutallocate ODBC Environment handle errors.endl;return -1;/ Notify ODBC that this is an ODBC 3.0 application.retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);if(retcode 0 )coutthe ODBC is not version3.0 endl;return -1;/ Allocate an ODBC connection and connect.retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);if(retcode 0 )coutallocate ODBC connection handle errors.endl;return -1;/Data Source Name must be of type User DNS or System DNSchar* szDSN = lanxin;char* szUID = lanxin;/log namechar* szAuthStr = lanxin;/passward/connect to the Data Sourceretcode = SQLConnect(hdbc1, (SQLCHAR*)szDSN, (SWORD)strlen(szDSN),(SQLCHAR*)szUID, (SWORD)strlen(szUID),(SQLCHAR*)szAuthStr, (SWORD)strlen(szAuthStr);if(retcode 0 )coutconnect to ODBC datasource errors.endl;return -1;/ Allocate a statement handle.retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);if(retcode 0 )coutallocate ODBC statement handle errors.endl;return -1;/ Execute an SQL statement directly on the statement handle.retcode = SQLExecDirect(hstmt1,(SQLCHAR*)SElECT sname,city FROM s WHERE s# != s1, SQL_NTS);if(retcode 0 )coutExecuting statement throught ODBC errors.endl;return -1;/ SQLBindCol variablesSQLCHAR cityMaxNameLen + 1;SQLCHAR nameMaxNameLen + 1;SQLINTEGER columnLen = 0;/数据库定义中该属性列的长度retcode = SQLBindCol(hstmt1, 1, SQL_C_CHAR,name,MaxNameLen , &columnLen);retcode = SQLBindCol(hstmt1, 2, SQL_C_CHAR,city,MaxNameLen , &columnLen);while ( (retcode = SQLFetch(hstmt1) ) != SQL_NO_DATA ) if(columnLen=0)printf(name = %sttcity=NULLn, name);elseprintf(name = %sttcity=%sn, name,city);/* Clean up.*/SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);SQLDisconnect(hdbc1);SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);SQLFreeHandle(SQL_HANDLE_ENV, henv);return(0);B、odbc.cpp运行该程序后,其结果为:思考:1、如何判断调用ODBC函数是否正确?常见的错误类型有哪些?如何得到错误信息?举例说明答:实验中的错误都是通过每个函数的返回值来判断的,其中用了中间变量retcode,通过判断它的值来判断刚执行的函数是否正确,如当值小于零时就发生错误。查阅资料了解到ODBC 中的错误其实是使用来自每个 ODBC 函数调用和SQLGetDiagRec 函数的返回值进行报告的。每个 ODBC 函数都返回一个 SQLRETURN,其值为下列状态代码为之一:状态代码 说明 SQL_SUCCESS 无错误。 SQL_SUCCESS_WITH_INFO 该函数完成,但是每一个对 SQLError 的调用都将显示一个警告。 这种状态最常见的情况是:返回的值太长,应用程序提供的缓冲区不够用。SQL_ERROR 函数未完成,因为出现了错误。调用 SQLError 可获得关于此问题的详细信息。 SQL_INVALID_HANDLE 作为参数传递的环境、连接或语句句柄无效。 如果在释放句柄后再使用该句柄,或者句柄为空值指针,则通常会发生这种情况。SQL_NO_DATA_FOUND 没有可用信息。 使用这种状态的最常见情况是在从游标进行读取时,这种状态表示游标中没有更多行。SQL_NEED_DATA 参数需要数据。 这是一项高级特性,SQLParamData 和 SQLPutData 下面的 ODBC SDK 文档对其作了说明。每个环境、连接和语句句柄都可能有与之相关联的一个或多个错误或警告。每个对 SQLError 或 SQLGetDiagRec 的调用都返回关于一个错误的信息,然后删除关于该错误的信息。如果您不调用 SQLError 或 SQLGetDiagRec 删除所有错误,则将在执行下一个将同一句柄作为参数来传递的函数调用时删除这些错误。每个对 SQLError 的调用都会传递三个句柄,分别用于环境、连接和语句。第一个调用使用 SQL_NULL_HSTMT 获取与连接相关联的错误。类似地,使用 SQL_NULL_DBC 和 SQL_NULL_HSTMT 的调用将获取任何与环境句柄相关联的错误。每个对 SQLGetDiagRec 的调用将传递环境、连接或语句句柄。第一个调用传递句柄类型 SQL_HANDLE_DBC 以获取与连接关联的错误。第二个调用传递句柄类型 SQL_HANDLE_STMT 以获取与刚执行的语句关联的错误。如果有错误(不是 SQL_ERROR)需要报告,SQLError 和 SQLGetDiagRec 将返回 SQL_SUCCESS;如果没有其它错误要报告,则返回 SQL_NO_DATA_FOUND。示例 1:下面的代码段使用了 SQLError 并返回代码:/* Declare required variables */SQLHDBC dbc;SQLHSTMT stmt;SQLRETURN retcode;UCHAR errmsg100;/* code omitted here */retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt );if( retcode = SQL_ERROR ) SQLError( env, dbc, SQL_NULL_HSTMT, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Assume that print_error is defined */ print_error( Allocation failed, errmsg ); return;/* Delete items for order 2015 */retcode = SQLExecDirect( stmt, delete from sales_order_items where id=2015, SQL_NTS );if( retcode = SQL_ERROR ) SQLError( env, dbc, stmt, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Assume that print_error is defined */ print_error( Failed to delete items, errmsg ); return;示例 2下面的代码段使用了 SQLGetDiagRec 并返回代码:/* Declare required variables */SQLHDBC dbc;SQLHSTMT stmt;SQLRETURN retcode;SQLSMALLINT errmsglen;SQLINTEGER errnative;UCHAR errmsg255;UCHAR errstate5;/* code omitted here */retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt );if( retcode = SQL_ERROR ) SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, errstate, &er

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论