SQLBindCol
函數(shù)功能描述:將數(shù)據(jù)緩沖綁定到結(jié)果集的列
說明:
版本引入:ODBC 1.0
遵從標(biāo)準(zhǔn):ISO 92
功能說明: SQLBindCol將應(yīng)用程序的數(shù)據(jù)緩沖綁定到結(jié)果集的各列
函數(shù)原型: SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLINTEGER BufferLength,
SQLLEN * StrLen_or_Ind);
參數(shù):
StatementHandle
[輸入] 聲明的句柄
ColumnNumber
[輸入] 結(jié)果集里要綁定的列號。列號為從0開始遞增的數(shù)字編號,第0列為書簽列。如果沒有使用書簽――就是說,SQL_ATTR_USE_BOOKMARKS這個聲明屬性被置為SQL_UB_OFF――那么列號從1開始計(jì)數(shù);
TargetType
[輸入] *TargetValuePtr所指緩沖的C數(shù)據(jù)類型的標(biāo)識符,當(dāng)通過SQLFetch, SQLFetchScroll, SQLBulkOperations或 SQLSetPos從數(shù)據(jù)源取得數(shù)據(jù)的時候,驅(qū)動程序?qū)?shù)據(jù)轉(zhuǎn)換成這個類型;當(dāng)通過SQLBulkOperations或SQLSetPos發(fā)送數(shù)據(jù)到數(shù)據(jù)源時,驅(qū)動程序從這個類型來轉(zhuǎn)換數(shù)據(jù)。
TargetValuePtr
[輸入/輸出] 用來綁定列的數(shù)據(jù)緩沖的指針。SQLFetch 和SQLFetchScroll返回?cái)?shù)據(jù)到這個緩沖。當(dāng)操作為SQL_FETCH_BY_BOOKMARK標(biāo)識的時候SQLBulkOperations返回?cái)?shù)據(jù)到這個緩沖。當(dāng)操作為SQL_ADD 或 SQL_UPDATE_BY_BOOKMARK時,從這個緩沖取得數(shù)據(jù)。當(dāng)操作為SQL_REFRESH時,SQLSetPos返回?cái)?shù)據(jù)到這個緩沖中;當(dāng)操作為SQL_UPDATE時,從這個緩沖取得數(shù)據(jù)。如果TargetValuePtr為一空指針,驅(qū)動程序取消列到數(shù)據(jù)緩沖的綁定。應(yīng)用程序可通過SQL_UNBIND選項(xiàng)通過調(diào)用SQLFreeStmt來取消所有列的綁定。如果SQLBindCol調(diào)用的TargetValuePtr參數(shù)為空指針而StrLen_or_IndPtr是有效的值的話,應(yīng)用程序可取消列的綁定但仍然存在一個該列的長度/指示緩沖綁定。
BufferLength
[輸入] *TargetValuePtr指向的緩沖的字節(jié)數(shù)長度。驅(qū)動程序使用BufferLength來避免返回可變長數(shù)據(jù)如字符或二進(jìn)制數(shù)時寫過*TargetValuePtr的邊界。注意驅(qū)動程序會在返回字符數(shù)據(jù)到*TargetValuePtr時計(jì)算空終止符。因此*TargetValuePtr緩沖就要包括空終止符的空間,否則驅(qū)動程序會截短數(shù)據(jù)。當(dāng)驅(qū)動程序返回定長數(shù)據(jù)如整形數(shù)或一個數(shù)據(jù)結(jié)構(gòu)時,驅(qū)動程序會忽略BufferLength參數(shù)并判斷緩沖是否足夠大來接收數(shù)據(jù)。因此很重要的是應(yīng)用程序要分配一個足夠大的緩沖給定長數(shù)據(jù),否則驅(qū)動程序會寫過緩沖的界。當(dāng)BufferLength 小于0時SQLBindCol返回SQLSTATE HY090(無效的字符串或緩沖長度),等于0時不返回這個結(jié)果,可是,如果TargetType指定為一個字符類型,應(yīng)用程序就不要將BufferLength設(shè)為0,因?yàn)镮SO的CLI-適應(yīng)的 驅(qū)動程序在這種情況下返回SQLSTATE HY090。
StrLen_or_IndPtr
[輸入/輸出] 指向綁定列的長度/指示緩沖。SQLFetch 和 SQLFetchScroll返回一個數(shù)值到這個緩沖。當(dāng)操作為SQL_ADD,SQL_UPDATE_BY_BOOKMARK, 或 SQL_DELETE_BY_BOOKMARK時SQLBulkOperations從這個緩沖取得一個數(shù)值。當(dāng)操作為SQL_FETCH_BY_BOOKMARK時SQLBulkOperations返回一個數(shù)值到這個緩沖,當(dāng)操作為SQL_REFRESH時SQLSetPos返回一個數(shù)值到此緩沖;但操作為SQL_UPDATE時,它從這個緩沖取回一個數(shù)值。SQLFetch, SQLFetchScroll, SQLBulkOperations, 和 SQLSetPos可返回以下數(shù)值到長度/指示緩沖:
l 返回?cái)?shù)據(jù)的有效長度
l SQL_NO_TOTAL
l SQL_NULL_DATA
應(yīng)用程序可下列值放入長度/指示緩沖給供SQLBulkOperations 或SQLSetPos使用:
l 待發(fā)送數(shù)據(jù)的長度
l SQL_NTS
l SQL_NULL_DATA
l SQL_DATA_AT_EXEC
l SQL_LEN_DATA_AT_EXEC宏的結(jié)果
l SQL_COLUMN_IGNORE
如果指示緩沖和長度緩沖是分開的緩沖區(qū)的話,指示緩沖只能返回SQL_NULL_DATA,而長度緩沖可返回所有其他的值。如果StrLen_or_IndPtr為一個空指針,那么沒有可用的長度或指示值。這是當(dāng)取數(shù)據(jù)且數(shù)據(jù)為NULL時的一個錯誤。
返回值:
SQL_SUCCESS,SQL_SUCCESS_WITH_INFO,SQL_ERROR,或SQL_INVALID_HANDLE.
備注:此SDK函數(shù)的使用涉及到很多相關(guān)的部分,請使用者一定要認(rèn)真仔細(xì)。
示例代碼:
#define NAME_LEN 50
#define PHONE_LEN 10
SQLCHAR szName[NAME_LEN], szPhone[PHONE_LEN];
SQLINTEGER sCustID, cbName, cbCustID, cbPhone;
SQLHSTMT hstmt;
SQLRETURN retcode;
retcode = SQLExecDirect(hstmt,
"SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",
SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
/* Bind columns 1, 2, and 3 */
SQLBindCol(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);
SQLBindCol(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLBindCol(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN, &cbPhone);
/* Fetch and print each row of data. On */
/* an error, display a message and exit. */
while (TRUE)
{
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)
{
show_error();
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
fprintf(out, "%-*s %-5d %*s", NAME_LEN-1, szName,
sCustID, PHONE_LEN-1, szPhone);
}
else
{
break;
}
}
}