大对象数据写入

使用大对象数据作为执行参数时,可以使用和其他数据类型相同的参数绑定方式,并为大对象指定存放数据的应用程序变量。 但是这样的做法需要把大对象数据全部读入到内存,在数据量较大时(例如几百M时),会占用大量的内存。 因此,此时更一般的方法是将大对象数据类型的列绑定成执行期参数,之后在查询执行的SQL_NEED_DATA循环中重复调用SQLPutData分多次放入大对象数据。

例如,应用程序可以允许用户指定本地的某个数据文件作为大对象的数据来源。 当用户使用大对象进行数据库操作时,应用程序可以使用SQLPutdata将文件分成几个部分读入。

//CREATE TABLE PICTURES(ID int, PICTURE blob);
#define MAX_DATA_LEN 1024
SQLINTEGER DataLen, ID , IDInd = 0, PictureInd = SQL_DATA_AT_EXEC ;
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 main( )
{
// 句柄的分配,数据库连接
... ...
// 分配语句句柄
    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);
    ID = 8;
// 执行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);
// 释放语句句柄、 断开连接
        ... ...
        return 0;
}