我需要在C ++ / ODBC应用程序中摆脱固定的数组大小。 而是硬编码的数组大小(ROWS = 10以下)我想传递ROWS作为命令行参数。我知道如何解析命令行。 但是如何调整以下代码?
#define ROWS 10 SQLINTEGER idata[ROWS] SQLCHAR cdata1[ROWS][256] SQLFLOAT fdata[ROWS] SQL_TIMESTAMP_STRUCT ts[ROWS] SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE, ROWS) SQLBindCol(1, &idata) SQLBindCol(2, cdata1) SQLBindCol(3, fdata) SQLBindCol(4, &ts) SQLExecDirect("query producing a result-set")
更新:我无法修改SQLBindCol(..)
的签名假设我将创建std :: vector而不是SQLFLOAT fdata [ROWS],但是如何将它传递给不期望std :: vector的SQLBindCol()?
答案 0 :(得分:1)
在std::vector
上使用fdata
:
size_t rowCount = /* ... */;
std::vector<SQLFLOAT> fdata(rowCount);
// ...
SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE, rowCount);
// ...
SQLBindCol(3, &fdata[0]);
// ...
对于cdata1
,std::vector<SQLCHAR> cdata1(250 * rowCount);
可能会有效。
答案 1 :(得分:0)
使用指针。
如你所说,从命令行接受ROWS参数。使用malloc / new分配你声明的所有变量,如idata,cdata1等,使用动态内存分配来分配所需大小的内存(你获得的ROWS参数)。就是这样!
答案 2 :(得分:0)
我还没有设法使用2d动态数组。 但这是使用1d数组的动态2d阵列的解决方案
std::set<std::string> getResults(int columnIndex, HSTMT stmt) {
std::set<std::string> results;
RETCODE rc = 0;
int rows = 250;
int colsize = 500 + 1; //Need to increment colunm size by 1 because SQLBindCol add the terminator character "\0"
SQLLEN *indicator1 = new SQLLEN[rows];
char *buff = new char[rows*colsize];
SQLSetStmtAttr(stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)rows, 0);
SQLUINTEGER NumRowsFetched;
SQLSetStmtAttr(stmt, SQL_ATTR_ROWS_FETCHED_PTR, &NumRowsFetched, 0);
SQLBindCol(stmt, columnIndex, SQL_C_CHAR, buff, colsize, indicator1);
while (rc = SQLFetch(stmt) == SQL_SUCCESS) {
for (int i = 0; (SQLUINTEGER)i < NumRowsFetched; i++) {
results.insert(&buff[i * colsize]);
}
}
delete[] buff;
return results;
}