2011-04-08 13 views
1

我正在學習如何使用SQLBindParameter函數。我正在通過互聯網上的幾個例子,我不清楚我應該通過什麼作爲SQLBindParameter函數的第6個參數。在C/C++程序中作爲ODBC SQLBindParameter的ColumnSize參數傳遞什麼?

http://msdn.microsoft.com/en-us/library/ms710963(v=vs.85).aspx的示例在C類型爲SQL_C_CHAR時傳遞字符數組的大小,而在C類型爲SQL_C_SSHORT時爲0。

SQLSMALLINT sCustID;  
SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN]; 
SQL_DATE_STRUCT dsOrderDate; 
SQLINTEGER cbCustID = 0, cbOrderDate = 0, cbEmployeeID = SQL_NTS; 

...

retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, EMPLOYEE_ID_LEN, 0, szEmployeeID, 0, &cbEmployeeID); 
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &sCustID, 0, &cbCustID); 

然而,在http://publib.boulder.ibm.com/infocenter/db2e/v8r2/index.jsp?topic=%2Fcom.ibm.db2e.doc%2Fdbeapc1702.html一例SQL_C_TCHAR和SQL_C_LONG一些正整數傳遞0。

long p1 = 10; 
short p2 = 100; 
TCHAR p3[100]; 

...

// bind input parameters 
rc = SQLBindParameter(hstmt, (unsigned short)1, SQL_PARAM_INPUT, 
         SQL_C_LONG, SQL_INTEGER, 4, 0, &p1, sizeof(p1), &len); 
// check return code ... 

rc = SQLBindParameter(hstmt, (unsigned short)2, SQL_PARAM_INPUT, SQL_C_LONG, 
         SQL_SMALLINT, 2, 0, &p2, sizeof(p2), &len); 
// check return code ... 

len = SQL_NTS; 
rc = SQLBindParameter(hstmt, (unsigned short)3, SQL_PARAM_INPUT, SQL_C_TCHAR, 
           SQL_CHAR, 0, 0, &p3[0], 100, &len); 

可能有人請澄清我們究竟如何決定要傳遞到SQLBindParameter參數?

+0

在這裏發佈相關問題:http://stackoverflow.com/q/5636712/303363 – 2011-04-12 14:54:27

回答

2

這是爲了幫助確定某些類型的參數的字節大小,而對於其他類型的參數則忽略它們。

假設您有一個SQLCHAR[10]參數,你會在傳遞10爲柱尺寸:

SQLCHAR empStr[10]; 
SQLINTEGER len = SQL_NTS; 
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 10, 0, empStr, 0, &len); 

編輯:

更清晰的變量類型必須特別是可變大小的類型,如通過大小這樣你就知道數據在內存中的位置。整數等類型具有基於操作系統和環境的靜態定義大小,因此指定大小通常是可選的,或者可以定義一個常量來代替計算。

考慮:

int smallInt = 5; 
int bigInt = 234872634872; 
char oneChar = 'A'; 
char charArray[128] = "CStyle String\0"; 

int smallIntSize = sizeof(smallInt); 
int bigIntSize = sizeof(bigInt); 
int oneCharSize = sizeof(oneChar); 
int charArraySize = sizeof(charArray); 

在我的Windows 7 64位計算機使用Visual Studio 2010都SMALLINT和BIGINT的大小是4 oneChar的大小是1 charArray的大小,即使128的字符串時,它包含的內容要小得多,它仍然擁有分配的所有空間。

+0

我也很想知道爲什麼你通過0作爲BufferLength(第9個參數)。你爲什麼不把它設置爲10?據我所知,只有在執行SQL語句期間要在緩衝區中返回值時才使用此參數,以便將返回值截斷爲此大小以防止緩衝區溢出。 我正確嗎? – 2011-04-08 15:24:59

+0

_BufferLength_參數允許您在char和binary類型上截斷_ParameterValuePtr_大小,對於每個其他類型的AFAIK都會忽略它。 – AJG85 2011-04-08 15:33:01

+0

您的編輯問題。字符串參數的長度已經被指定爲指向SQL_NTS的指針,作爲「StrLen_or_IndPtr」參數(第10個參數)。難道這不足以確切知道數據的結束位置嗎? – 2011-04-08 15:33:04

相關問題