如用执行时数据列 (ODBC)
使用作为执行时数据的 text、ntext 或 image 列
对于每个执行时数据列,请将特殊值放到以前通过SQLBindCol 绑定的缓冲区中:
对于最后一个参数,请使用 SQL_LEN_DATA_AT_EXEC(length),其中,length 是以字节为单位的 text、ntext 或 image 列数据的总计长度。
对于第四个参数,请放入程序定义的列标识符。
调用 SQLSetPos 将返回 SQL_NEED_DATA,该值指示执行时数据列已经可供处理。
对于每个执行时数据列:
调用 SQLParamData 以获得列数组指针。 如果存在另一个执行时数据列,它将返回 SQL_NEED_DATA。
调用 SQLPutData 一次或多次以发送列数据,直到长度已发送。
调用 SQLParamData 以指示最后一个执行时数据列的所有数据已发送。 它不会返回 SQL_NEED_DATA。
示例
此示例显示如何使用 SQLGetData 读取 SQL_LONG 变量字符数据。 IA64 平台不支持此示例。
此外,还需要一个名为 AdventureWorks 的 ODBC 数据源,其默认数据库是 AdventureWorks 示例数据库。 (可以从 Microsoft SQL Server Samples and Community Projects(Microsoft SQL Server 示例和社区项目)主页下载 AdventureWorks 示例数据库。)此数据源必须基于操作系统提供的 ODBC 驱动程序(该驱动程序的名称为“SQL Server”)。 如果您要将此示例构建为在 64 位操作系统上运行的 32 位应用程序并运行该示例,则必须使用 %windir%\SysWOW64\odbcad32.exe 中的 ODBC 管理器创建 ODBC 数据源。
此示例连接到您的计算机上默认的 SQL Server 实例。 若要连接到命名实例,请更改 ODBC 数据源的定义以使用以下格式指定实例:server\namedinstance。 默认情况下,SQL Server Express 将安装在命名实例中。
执行第一个 (Transact-SQL) 代码列表,以创建该示例使用的表。
使用 odbc32.lib 编译第二个 (C++) 代码列表。 然后,执行该程序。
执行第三个 (Transact-SQL) 代码列表,以删除该示例使用的表。
use AdventureWorks
CREATE TABLE emp3 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES ('Name1', '12', 'This is the first employee')
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES ('Name2', '18', 'This is the second employee')
// compile with: odbc32.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
#define BUFFERSIZE 450
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
void Cleanup() {
if (hstmt1 != SQL_NULL_HSTMT)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
if (hdbc1 != SQL_NULL_HDBC) {
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
}
if (henv != SQL_NULL_HENV)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
};
int main() {
RETCODE retcode;
SWORD cntr;
// SQLGetData variables.
UCHAR Data[BUFFERSIZE];
SDWORD cbBatch = (SDWORD)sizeof(Data)-1;
SQLLEN cbTxtSize;
// Clear data array.
for (cntr = 0 ; cntr < BUFFERSIZE ; cntr++)
Data[cntr] = 0x00;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(Env) Failed\n\n");
Cleanup();
return(9);
}
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Allocate ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLConnect() Failed\n\n");
Cleanup();
return(9);
}
// Allocate statement handle; prepare, then execute command.
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLAllocHandle(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT Memo1 FROM emp3", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect Failed\n\n");
Cleanup();
return(9);
}
// Get first row.
retcode = SQLFetch(hstmt1);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLFetch(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
// Get the SQL_LONG column.
cntr = 1;
while ( (retcode = SQLGetData(hstmt1, 1, SQL_C_CHAR, Data, cbBatch, &cbTxtSize)) != SQL_NO_DATA) {
printf("GetData iteration %d, pcbValue = %d,\n", cntr++, cbTxtSize);
printf("Data = %s\n\n", Data);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("GetData(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
}
// Clean up
//SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'emp3')
DROP TABLE emp3
GO