示例

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;
}