示例¶
LOB数据写入¶
使用执行期参数存储大对象,此示例显示在INSERT语句中使用执行期参数处理大对象。此外,示例使用准备执行,并略去了连接数据库和断开连接的上下文以及错误处理的代码。
示例中使用表PICTURES,它的结构如下:
//CREATE TABLE PICTURES(ID int, PICTURE blob);
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#define MAX_DATA_LEN 1024
SQLINTEGER DataLen, ID , IDInd = 0, PictureInd = -2 ;
SQLCHAR Data[MAX_DATA_LEN];
SQLPOINTER ValuePtr;
RETCODE retcode;
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int GetID(SQLINTEGER *a)
{
*a = 8;
return 1;
}
int main( )
{
// 分配ODBC环境句柄
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// 指定应用程序ODBC版本
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER);
// 分配ODBC连接句柄并连接
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1,(SQLCHAR*)"OSRDBSource",
SQL_NTS,(SQLCHAR*)"sysdba", SQL_NTS,
(SQLCHAR*)"szoscar55",SQL_NTS);
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
retcode = SQLPrepare(hstmt1, (SQLCHAR*)"INSERT INTO PICTURES (ID,
PICTURE)VALUES (?, ?)", SQL_NTS);
retcode =SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_SLONG,
SQL_INTEGER, 0, 0, &ID, 0, &IDInd);
retcode =SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT,
SQL_C_BINARY,SQL_LONGVARBINARY, 0, 0, 0, 0, &PictureInd);
// 设置第二个绑定参数为执行期参数
PictureInd = SQL_DATA_AT_EXEC;
// 应用程序获得第一个执行参数的值
GetID(&ID);
// 执行SQL语句
retcode = SQLExecute(hstmt1);
// 为大对象类型的执行期参数提供数据
while (retcode == SQL_NEED_DATA)
{
retcode = SQLParamData(hstmt1, &ValuePtr);
if (retcode == SQL_NEED_DATA)
{
strcpy((char*)Data,"构造大对象数据:sfsgsfsffsfsfsfsfsfsfsg");
DataLen = 1024;
SQLPutData(hstmt1, Data, DataLen);
}
}
SQLFreeStmt(hstmt1, SQL_CLOSE);
// 释放语句句柄
// 断开连接
// 释放连接句柄和环境句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
LOB数据读取¶
使用SQLGetData读取大对象,此示例显示使用SQLGetData读取大对象数据。此外,示例略去了连接数据库和断开连接的上下文以及错误处理的代码。
示例中使用表PICTURES,它的结构如下:
//CREATE TABLE PICTURES(ID int, PICTURE blob);
#include "stdafx.h"
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#define MAX_DATA_LEN 1024
SQLINTEGER ID, IDInd, DataLen;
SQLCHAR Data[MAX_DATA_LEN];
int main()
{
RETCODE retcode;
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
// 分配ODBC环境句柄
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// 指定应用程序ODBC版本
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER);
// 分配ODBC连接句柄并连接
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1,(SQLCHAR*)"OSRDBSource",
SQL_NTS,(SQLCHAR*)"sysdba", SQL_NTS,
(SQLCHAR*)"szoscar55",SQL_NTS);
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
// 绑定表PICTURES的ID列
SQLBindCol(hstmt1, 1, SQL_C_SLONG, &ID, 0, &IDInd);
// 执行SQL语句
retcode = SQLExecDirect(hstmt1, (SQLCHAR*)"SELECT ID, PICTURE FROM
PICTURES", SQL_NTS);
// 为大对象类型的执行期参数提供数据
while (SQLFetch(hstmt1) != SQL_NO_DATA)
{
while (SQLGetData(hstmt1, 2, SQL_C_BINARY, Data, sizeof(Data),
&DataLen) != SQL_NO_DATA)
{
// 应用程序处理程序变量Data中读取的数据,数据的有效长度有DataLen指定
}
}
//SQLFreeStmt(hstmt, SQL_COLSE);
// 释放语句句柄
// 断开连接
// 释放连接句柄和环境句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}