[英]Can ColumnSize argument of ODBC SQLBindParameter be strlen(param) + 1 for SQLCHAR type parameter?
[英]What to pass as the ColumnSize argument of ODBC SQLBindParameter in a C/C++ program?
我正在學習如何使用SQLBindParameter
函數。 我正在瀏覽 Internet 上的幾個示例,但不清楚我應該將什么作為第 6 個參數傳遞給SQLBindParameter
函數。
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 傳遞 0,為 SQL_C_TCHAR 傳遞一些正整數SQL_C_LONG。
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
的參數嗎?
這是為了幫助確定某些類型的參數的字節大小,而其他類型則忽略它。
假設您有一個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);
在我使用 Visual Studio 2010 的 Windows 7 64 位機器上,smallInt 和 bigInt 的大小都是 4,oneChar 的大小是 1,charArray 的大小是 128,即使它包含的字符串小得多,它仍然分配了所有空間。
ColumnSize
參數對應於您的數據庫方案中的列大小
所有字符類型
以字符為單位的已定義或最大列大小(包含在 SQL_DESC_LENGTH 描述符字段中)。 例如,定義為 CHAR(10) 的單字節字符列的列大小為 10。 ( ODBC 參考)
對於固定長度( SQL_INTEGER
等)數據類型,將忽略 SQLBindParameter 的ColumnSize
參數。 ( ODBC 參考)
當SQL_PARAM_INPUT
它可能被某些驅動程序忽略,但其他驅動程序可能會將您的緩沖區截斷為ColumnSize
對於可變長度數據類型,Size 描述了要傳輸到服務器的最大數據量。 例如,對於 Unicode 字符串值,可使用 Size 將發送到服務器的數據量限制為前一百個字符。 ( .NET ODBC 參考)
當SQL_PARAM_*OUTPUT
某些驅動程序在未指定ColumnSize
時無法找到列(尤其是[Microsoft][ODBC SQL Server Driver]COUNT field incorrect or syntax error
),即使發送 NULL 也是如此。 對於雙向和輸出參數以及返回值,必須設置Size 的值。 ( .NET ODBC 參考)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.