2012-11-11 144 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。

相关问题