2012-02-10 8 views
0

C++/ODBCアプリケーションで固定配列サイズを取り除く必要があります。 ハードコードされた配列サイズ(ROWS = 10以下)では、コマンドライン引数としてROWSを渡したいと思っています。私はコマンドラインを解析する方法を知っています。 しかし、次のコードを調整するには?C++コードをリファクタリングして動的配列サイズをサポートする方法

 
    #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(..)の署名を変更することはできません

レッツは)(代わりにSQLFLOAT FDATAのベクトルは[ROWS] ::私はSTDを作成すると言うが、SQLBindColのにそれを渡す方法std :: vectorは期待していませんか?

+4

を使用して動的2次元配列のためのソリューションですあなたはC++で可変長配列を持つことができない配列の長さはconstant.Youは 'STDを使用して検討する必要がありますコンパイル時でなければなりません。: :vector'または 'std :: array'を使用します。 –

+2

C++は可変長配列を提供しませんが、コンパイル時定数である必要はありません。それが '新しい'のためのものです。例えば'SQLINTEGER * idata = new SQLINTEGER [rows]'(後で '[]'を削除することを忘れないでください)。多次元配列 'cdata1'は動的に割り当てられないので、より大きな問題です。あなたができる最善の方法は、配列の配列か、一つの '新しいSQLCHAR [rows * 256]'です。ここで 'SQLBindCol'がどのように動作するかによって動作するかもしれません。私はそれ以上のことを助けるためにODBCについて十分に知りません。 –

答えて

1

fdatastd::vectorの使用:

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);が働くかもしれません。

0

ポインタを使用してください。

あなたが言ったようにコマンドラインからROWS引数を受け入れます。 idata、cdata1などのように宣言したすべての変数にmalloc/newを使用して、動的メモリ割り当てを使用して、必要なサイズ(取得するROWS引数)のメモリを割り当てます。

0

私はそれを2dダイナミックアレイで動作させることはできませんでした。 しかし、ここでは1次元配列

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; 

} 
関連する問題