在我调用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的数组,您可以使用堆栈,如:'char c;如果(retcode = SQLGetData(hstmt,31,SQL_C_BINARY,&c,0,&cbfdata)!= SQN_NO_DATA)...' –
请注意,这只适用于SQL_C_BINARY数据或者当没有任何字符集转换暗示,否则cbfdata可能会收到SQL_NO_TOTAL(请参阅[this SQLGetData page](https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-api/sqlgetdata))。在这种情况下,您会遇到一个循环,它会在不知道总长度的情况下检索数据块。 –