2012-11-11 143 views
0

在我調用SQLGetData函數之前,我想知道表中可用數據的確切大小。目前我遵循下面列出的代碼,這對我很有用,但我不確定它是否安全。如何在調用SQLGetData之前知道數據的大小

任何人都可以幫助我嗎?

char*ptr = new char[0]; 


     if (retcode = SQLGetData(hstmt, 31, SQL_C_BINARY, ptr,0,&cbfdata) != SQL_NO_DATA) 
     { 
      delete[] ptr; 
      vector<char> vec(cbfdata); 

      SQLGetData(hstmt, 31, SQL_C_BINARY, &vec[0],cbfdata,&cbfdata); 

      ofstream fout; 
      fout.open(file,ios::binary); 
      fout.write(&vec[0],cbfdata); 
      fout.close(); 
      vec.clear(); 
     } 

回答

-1

調用不帶指針的SQLGetData(NULL)在cbfdata中返回7,這不是實際大小。

我已經嘗試創建0大小的指針並在其他小型項目中刪除它。它不會失敗。

但不承擔風險,我通過將刪除在結束和規模日益擴大

爲1個字節提高代碼點點。

 char*ptr = new char[1]; 

     if (retcode = SQLGetData(hstmt, 31, SQL_C_BINARY, ptr,0,&cbfdata) != SQL_NO_DATA) 
     { 
      vector<char> vec(cbfdata); 
      SQLGetData(hstmt, 31, SQL_C_BINARY, &vec[0],cbfdata,&cbfdata); 

      ofstream fout; 
      fout.open(file,ios::binary); 
      fout.write(&vec[0],cbfdata); 
      fout.close(); 
      vec.clear(); 
     } 
     delete[] ptr; 
+0

除了分配一個長度爲1的數組,您可以使用堆棧,如:'char c;如果(retcode = SQLGetData(hstmt,31,SQL_C_BINARY,&c,0,&cbfdata)!= SQN_NO_DATA)...' –

+0

請注意,這隻適用於SQL_C_BINARY數據或者當沒有任何字符集轉換暗示,否則cbfdata可能會收到SQL_NO_TOTAL(請參閱[this SQLGetData page](https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-api/sqlgetdata))。在這種情況下,您會遇到一個循環,它會在不知道總長度的情況下檢索數據塊。 –

0

你就不能調用SQLGetData沒有數據PTR第一和StrLen_or_IndPtr設置和驅動器的大小將寫入StrLen_or_IndPtr。

相關問題