2011-12-07 47 views
2

我一直在玩Row-Wise,Column-Wise和參數綁定,試圖找到一種方法來指向VARCHAR列的非順序數組緩衝區返回。C++使用ODBC綁定參數預先確定VARCHAR的長度

返回可能有10個字符或8000個字符。我不想顯式分配8000 x nRows字節的內存,所以我一直在用更好的方式進行操作。

第一個明顯的方法是8000個字節長,然後一旦SqlFetchO()返回列長度來分配緩衝器,分配正確的大小的返回和複製過來。由於副本價格昂貴,我試圖避免這種情況。

我接下來的想法是發出兩個SELECT語句。第一是:

SELECT DATALENGTH(Description) from SpecialOffer WHERE MinQty > 0 

我不知道有多貴,這是的,但假設沒有數據實際上是從數據庫複製,以及2字節長度字段是剛讀,這可能是快?在執行第二個查詢之前,我可以爲每個成員分配一個具有確切長度的數組。

有沒有辦法在SQL Server中檢索行之前獲取確切的VARCHAR列長度信息?

此外,有沒有什麼方法可以使用指定指向緩衝區指針的指針(即ODBC驅動程序所需的雙重引用)。這將允許我使用Row-Wise綁定和一個指向緩衝區的指針數組(使用第二種技術)。

回答

1

如果你用SQLPrepare查詢,你可以再調用SQLNumResultCols來查找列數,然後用SQLDescribeCol來獲取每列的長度和數據類型,然後用這些信息來分配和綁定數據緩衝區。然後使用SQLExecute和SQLFetch將數據返回到這些緩衝區中。

0

Necro回答這裏,但現有的並不真正解決您的問題。不,在驅動程序檢索行之前,無法獲取給定行長度中給定列的實際長度。

您需要分配比您需要的更多的內存(根據查詢和應用程序,這可能是也可能不是可接受的),或者您需要使用您的技巧。如果您選擇走這條路線,您需要確保您的第二個查詢與第一個查詢完全匹配 - 您的主鍵上的ORDER BY子句可能需要確保 SQL Server不插入具有您在第一個和第二個查詢之間返回的列。

另外,您可能希望查看在同一個ODBC Execute調用中運行這兩個查詢。這將使往返數據庫的次數最少,並可能會爲您帶來額外的性能。