2011-12-07 4 views
2

VARCHAR列のバッファの順序ではない配列を指す方法を見つけるために、Row-Wise、Column-Wise、戻る。ODBCバインドされたパラメータを使用してVARCHARの長さを事前に決定するC++

戻り値は10文字または8000である可能性があります。私は8000 x nRowsバイトのメモリを割り当てたいとは思わないので、これをより良くする方法を試しています。

最初の明白な方法は、8000バイトの長さのバッファを割り当ててから、SqlFetchO()が列の長さを返すと、返された正しいサイズを割り当て、コピー以上です。コピーは高価なので、私はこれを避けようとしています。

次の考えは、2つのSELECT文を発行することでした。最初は次のようになります。

SELECT DATALENGTH(Description) from SpecialOffer WHERE MinQty > 0 

私はこれがどのように高価わからないけど、何のデータが実際にデータベースからコピーされていない、と2バイトの長さフィールドが読み込まれたばかりされ、これは速いかもしれないと仮定しますか? 2番目のクエリを実行する前に、各メンバーが正確な長さを持つ配列を割り当てることができます。

SQL Serverで行が取得される前に、正確なVARCHAR列の長さ情報を取得する方法はありますか?

また、バッファポインタへのポインタを指定する方法はありますか(つまり、ODBCドライバで必要なダブル参照解除)。これにより、Row-Wiseバインディングとバッファへのポインタ配列を使用することができます(2番目の手法を使用)。

答えて

1

クエリをSQLプリペアすると、SQLNumResultColsを呼び出して列の数を検索し、次にSQLDescribeColを呼び出して各列の長さとデータ型を取得し、この情報を使用してデータバッファを割り当ててバインドできます。 SQLExecuteとSQLFetchを使用して、それらのバッファにデータを返します。

0

ここにネクロの答えはありますが、既存のものは本当にあなたの質問には答えません。いいえ。行がドライバによって取得される前に、指定された行の長さにある特定の列の実際の長さを取得する方法はありません。

必要以上にメモリを割り当てる必要があります(クエリやアプリケーションによっては許容範囲内である場合もあります)。DATALENGTHトリックを使用する必要があります。そのルートに行くことを選択する場合は、2番目のクエリが最初のクエリと正確に一致することを確認する必要があります。には、おそらく、にSQL Serverが最初と2番目のクエリの間に戻ってくる列。

また、両方のクエリを同じODBC Execute呼び出しで実行することもできます。それはデータベースへのラウンドトリップを最小限に抑え、あなたに余分なパフォーマンスを少し買うかもしれません。