5. 执行SQL语句 应用程序处理SQL语句的两种方式 预处理(SQLPrepare、SQLExecute适用于语句的多次执行) 直接执行(SQLExecdirect) 如果SQL语句含有参数,应用程序为每个参数调用SQLBindParameter,并把它们绑定至应用程序变量 应用程序可以直接通过改变应用程序缓冲区的内容从而在程序中动态改变SQL语句的具体执行 执行SQL语句(续) 应用程序根据语句类型进行的处理 有结果集的语句(select或是编目函数),则进行结果集处理 没有结果集的函数,可以直接利用本语句句柄继续执行新的语句或是获取行计数(本次执行所影响的行数)之后继续执行 在插入数据时,采用了预编译的方式,首先通过SQLPrepare来预处理SQL语句,然后将每一列绑定到用户缓冲区 执行SQL语句(续) 创建数据源---第五步:执行SQL语句 /* Step 5 两种方式执行语句 */ /* 预编译带有参数的语句 */ ret SQLPrepare serverhstmt,"INSERT INTO STUDENT SNO,SNAME, SSEX, SAGE,SDEPT VALUES ?, ?, ?, ?, ? ", SQL_NTS ; if ret SQL_SUCCESS || ret SQL_SUCCESS_WITH_INFO ret SQLBindParameter serverhstmt,1,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sSno,0, &cbSno ; ret SQLBindParameter serverhstmt,2,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,sName,0,&cbName ; ret SQLBindParameter serverhstmt,3,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,2,0,sSex,0,&cbSex ; ret SQLBindParameter serverhstmt,4,SQL_PARAM_INPUT, SQL_C_LONG,SQL_INTEGER,0,0,&sAge,0,&cbAge ; 执行SQL语句(续) ret SQLBindParameter serverhstmt,5,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, DEPART_LEN, 0, sDepart,0, &cbDepart ; /*执行SQL语句*/ ret SQLExecDirect kinghstmt,"SELECT * FROM STUDENT",SQL_NTS ; if ret SQL_SUCCESS || ret SQL_SUCCESS_WITH_INFO ret SQLBindCol kinghstmt,1,SQL_C_CHAR,sSno, SNO_LEN,&cbSno ; ret SQLBindCol kinghstmt,2,SQL_C_CHAR,sName, NAME_LEN,&cbName ; ret SQLBindCol kinghstmt,3,SQL_C_CHAR,sSex, SSEX_LEN,&cbSex ; ret SQLBindCol kinghstmt,4,SQL_C_LONG,&sAge, 0,&cbAge ; ret SQLBindCol kinghstmt,5,SQL_C_CHAR,sDepart, DEPART_LEN,&cbDepart ; 在[例8.12]中,使用SQLExecdirect获取KingbaseES中的结果集,并将结果集根据各列不同的数据类型绑定到用户程序缓冲区 6. 结果集处理 应用程序可以通过SQLNumResultCols来获取结果集中的列数 通过SQL DescribeCol或是SQLColAttrbute函数来获取结果集每一列的名称、数据类型、精度和范围 结果集处理(续) ODBC中使用游标来处理结果集数据 ODBC中游标类型 Forward-only游标,是ODBC的默认游标类型 可滚动(Scroll)游标 静态(static) 动态(dynamic) 码集驱动(keyset-driven) 混合型(mixed) 结果集处理(续) 结果集处理步骤 ODBC游标的打开方式不同于嵌入式SQL,不是显式声明而是系统自动产生一个游标,当结果集刚刚生成时,游标指向第一行数据之前 应用程序通过SQLBindCol把查询结果绑定到应用程序缓冲区中,通过SQLFetch或是SQLFetchScroll来移动游标获取结果集中的每一行数据 对于如图像这类特别的数据类型,当一个缓冲区不足以容纳所有的数据时,可以通过SQLGetdata分多次获取 最后通过SQLClosecursor来关闭游标 结果集处理(续) 创建数据源---第六步:结果集处理 /* Step 6 处理结果集并执行预编译后的语句*/ while ret SQLFetch kinghstmt ! SQL_NO_DATA_FOUND if ret SQL_ERROR printf "Fetch error\n" ; else ret SQLExecute serverhstmt ; 7. 中止处理 应用程序中止步骤 释放语句句柄 释放连接 与服务器断开 释放ODBC环境 中止处理(续) 创建数据源---第七步:中止处理 /* Step 7 中止处理*/ SQLFreeHandle SQL_HANDLE_STMT,kinghstmt ; SQLDisconnect kinghdbc ; SQLFreeHandle SQL_HANDLE_DBC,kinghdbc ; SQLFreeHandle SQL_HANDLE_ENV,kinghenv ; SQLFreeHandle SQL_HANDLE_STMT,serverhstmt ; SQLDisconnect serverhdbc ; SQLFreeHandle SQL_HANDLE_DBC,serverhdbc ; SQLFreeHandle SQL_HANDLE_ENV,serverhenv ; return 0; 第八章 编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程 *8.5 OLE DB *8.6 JDBC编程 8.7 小结 8.7 小结 嵌入式SQL把SQL语句嵌入到某种高级语言中 SQL与主语言具有不同的数据处理方式 本章讲解了以下内容 嵌入式SQL 过程化SQL 存储过程和函数 ODBC编程 OLE DB JDBC编程 * * 2. ODBC驱动程序管理器 驱动程序管理器:用来管理各种驱动程序 包含在ODBC32.DLL中 管理应用程序和驱动程序之间的通信 建立、配置或删除数据源,并查看系统当前所安装的ODBC驱动程序 ODBC驱动程序管理器(续) 主要功能: 装载ODBC驱动程序 选择和连接正确的驱动程序 管理数据源 检查ODBC调用参数的合法性 记录ODBC函数的调用等 3. 驱动程序 ODBC通过驱动程序来提供应用系统与平台的独立性 ODBC应用程序不能直接存取 其各种操作请求由驱动程序管理器提交给某个关系管理系统的ODBC驱动程序 通过调用驱动程序所支持的函数来存取 的操作结果也通过驱动程序返回给应用程序 如果应用程序要操纵不同的,就要动态地链接到不同的驱动程序上 驱动程序(续) ODBC驱动程序类型 单束 数据源和应用程序在同一台机器上 驱动程序直接完成对数据文件的I/O操作 驱动程序相当于数据管理器 多束 支持客户机—服务器、客户机—应用服务器/服务器等网络环境下的数据访问 由驱动程序完成访问请求的提交和结果集接收 应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据 4. ODBC数据源管理 数据源:是最终用户需要访问的数据,包含了位置和类型等信息,是一种数据连接的抽象 ODBC数据源管理 (续) 数据源对最终用户是透明的 ODBC给每个被访问的数据源指定唯一的数据源名(Data Source Name,简称DSN),并映射到所有必要的、用来存取数据的低层软件 在连接中,用数据源名来代表用户名、服务器名、所连接的名等 最终用户无须知道管理系统或其他数据管理软件、网络以及有关ODBC驱动程序的细节 ODBC数据源管理(续) 例如,假设某个学校在SQL Server和KingbaseES上创建了两个:学校人事和教学科研。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23745-1.html
的确