六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 65|回复: 0

DB2 通用数据库 iSeries 版 SQL 调用层接口(ODBC)

[复制链接]

升级  43.6%

228

主题

228

主题

228

主题

进士

Rank: 4

积分
718
 楼主| 发表于 2013-1-13 18:53:44 | 显示全部楼层 |阅读模式

<div style="margin-bottom: 1em; margin-left: 0.5em;">DB2 通用数据库 iSeries 版 SQL 调用层接口(ODBC)

 
SQLPrepare — 准备语句

 
用途
SQLPrepare() 使 SQL 语句与输入语句句柄相关联并将该语句发送至 DBMS 以进行准备。应用程序可以通过将该语句句柄传送给其它函数来引用这个准备好的语句。
如果已将语句句柄与 SELECT 语句配合使用,则在调用 SQLPrepare() 之前,必须调用 SQLFreeStmt() 来关闭游标。
语法
[size=90%]SQLRETURN SQLPrepare (SQLHSTMT       hstmt,                      SQLCHAR        *szSqlStr,                      SQLINTEGER     cbSqlStr);函数自变量 
表 129. SQLPrepare 自变量
[size=90%]数据类型[size=90%]自变量[size=90%]使用[size=90%]描述[size=90%]SQLHSTMT[size=90%]hstmt[size=90%]输入[size=90%]语句句柄。一定不能有打开的游标与 hstmt 相关联。[size=90%]SQLCHAR *[size=90%]szSqlStr[size=90%]输入[size=90%]SQL 语句字符串[size=90%]SQLINTEGER[size=90%]cbSqlStr[size=90%]输入[size=90%]szSqlStr 自变量的内容的长度。必须将此长度设置为 szSqlstr 中的 SQL 语句的精确长度,或者,如果语句文本以空终止,则设置为 SQL_NTS。
用法
在使用 SQLPrepare() 准备语句之后,应用程序可通过调用下列函数来请求关于结果集的格式的信息(如果该语句是 SELECT 语句的话):

  • SQLNumResultCols()
  • SQLDescribeCol()
  • SQLColAttributes()
可通过调用 SQLExecute() 来将准备好的语句执行一次或多次。在将该语句句柄与另一个SQLPrepare()、SQLExecDirect()、SQLColumns()、SQLSpecialColumns()、SQLStatistics() 或 SQLTables() 配合使用之前,该 SQL 语句将保持与该句柄相关联。
SQL 语句字符串可包含参数标记。参数标记由“?”字符表示,它用来指示语句中的一个位置,在调用 SQLExecute() 时,将在该位置替代应用程序变量的值。SQLBindParam() 用来将应用程序变量绑定到每个参数标记(使应用程序变量与参数标记相关联),以及指示在传送数据时是否应该执行任何数据转换。
SQL 语句不能是 COMMIT 或 ROLLBACK。必须通过调用 SQLTransact() 来发出 COMMIT 或 ROLLBACK。
如果 SQL 语句是定位型 DELETE 或定位型 UPDATE,则必须在同一个连接句柄下的单独语句句柄上定义该语句所引用的游标。
返回码

  • SQL_SUCCESS
  • SQL_SUCCESS_WITH_INFO
  • SQL_ERROR
  • SQL_INVALID_HANDLE
诊断 
表 130. SQLPrepare SQLSTATE
[size=90%]SQLSTATE[size=90%]描述[size=90%]说明[size=90%]24000[size=90%]游标状态无效[size=90%]在指定的 hstmt 上存在打开的游标。[size=90%]37xxx[size=90%]语法错误或访问违例[size=90%]szSqlStr 包含下列其中一项或多项:

  • COMMIT
  • ROLLBACK
  • 所连接的数据库服务器未能准备的 SQL 语句
  • 包含语法错误的语句
[size=90%]HY001[size=90%]内存分配失败[size=90%]驱动程序无法分配支持此函数的执行或完成所必需的内存。[size=90%]HY009[size=90%]自变量值无效[size=90%]szSqlStr 是空指针。 
自变量 cbSqlStr 小于 1,但不等于 SQL_NTS。
[size=90%]HY013 *[size=90%]内存管理问题[size=90%]驱动程序无法访问支持此函数的执行或完成所必需的内存。注意:并非所有 DBMS 在进行准备时都报告上述所有诊断消息。因此,应用程序在调用 SQLExecute() 时还必须能够处理这些情况。示例
有关以下示例中使用的 check_error、initialize 和 terminate 函数的列表,请参考示例:交互式 SQL 和等价的 DB2 UDB CLI 函数调用
[size=90%]/*************************************************************************** file = prepare.c**** Example of preparing then repeatedly executing an SQL statement.**** Functions used:****        SQLAllocConnect      SQLFreeConnect**        SQLAllocEnv          SQLFreeEnv**        SQLAllocStmt         SQLFreeStmt**        SQLConnect           SQLDisconnect****        SQLBindCol           SQLFetch**        SQLTransact          SQLError**        SQLPrepare           SQLSetParam**        SQLExecute**************************************************************************/ #include <stdio.h>#include <string.h>#include <stdlib.h>#include "sqlcli.h" #define MAX_STMT_LEN 255 int initialize(SQLHENV *henv,               SQLHDBC *hdbc); int terminate(SQLHENV henv,              SQLHDBC hdbc); int print_error (SQLHENV    henv,                 SQLHDBC    hdbc,                 SQLHSTMT   hstmt); int check_error (SQLHENV    henv,                 SQLHDBC    hdbc,                 SQLHSTMT   hstmt,                 SQLRETURN  rc); /********************************************************************* main** - initialize** - terminate*******************************************************************/int main(){    SQLHENV     henv;    SQLHDBC     hdbc;    SQLCHAR     sqlstmt[MAX_STMT_LEN + 1]="";    SQLRETURN   rc;     rc = initialize(&henv, &hdbc);    if (rc == SQL_ERROR) return(terminate(henv, hdbc));     {SQLHSTMT   hstmt;     SQLCHAR    sqlstmt[]="SELECT deptname, location from org where division = ?";     SQLCHAR    deptname[15],                location[14],                division[11];      SQLINTEGER rlength,                plength;         rc = SQLAllocStmt(hdbc, &hstmt);        if (rc != SQL_SUCCESS )            check_error (henv, hdbc, SQL_NULL_HSTMT, rc);         /* prepare statement for multiple use */        rc = SQLPrepare(hstmt, sqlstmt, SQL_NTS);        if (rc != SQL_SUCCESS )            check_error (henv, hdbc, hstmt, rc);         /* bind division to parameter marker in sqlstmt */        rc = SQLSetParam(hstmt, 1, SQL_CHAR, SQL_CHAR, 10, 10, division,                     &plength);        if (rc != SQL_SUCCESS )            check_error (henv, hdbc, hstmt, rc);         /* bind deptname to first column in the result set */        rc = SQLBindCol(hstmt, 1, SQL_CHAR, (SQLPOINTER) deptname, 15,                        &rlength);        if (rc != SQL_SUCCESS )            check_error (henv, hdbc, hstmt, rc);        rc = SQLBindCol(hstmt, 2, SQL_CHAR, (SQLPOINTER) location, 14,                         &rlength);        if (rc != SQL_SUCCESS )            check_error (henv, hdbc, hstmt, rc);         printf("\nEnter Division Name or 'q' to quit:\n");        printf("(Eastern, Western, Midwest, Corporate)\n");        gets(division);        plength = SQL_NTS;         while(division[0] != 'q')        {            rc = SQLExecute(hstmt);            if (rc != SQL_SUCCESS )                check_error (henv, hdbc, hstmt, rc);             printf("Departments in %s Division:\n", division);            printf("DEPTNAME       Location\n");            printf("-------------- -------------\n");             while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS)            {                printf("%-14.14s %-13.13s \n", deptname, location);            }            if (rc != SQL_NO_DATA_FOUND )                check_error (henv, hdbc, hstmt, rc);            SQLFreeStmt(hstmt, SQL_CLOSE);            printf("\nEnter Division Name or 'q' to quit:\n");            printf("(Eastern, Western, Midwest, Corporate)\n");            gets(division);        }    }     rc = SQLTransact(henv, hdbc, SQL_ROLLBACK);    if (rc != SQL_SUCCESS )        check_error (henv, hdbc, SQL_NULL_HSTMT, rc);     terminate(henv, hdbc);    return (0);}/* end main */参考
 
 
页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表