質問

動的SQLクエリを作成するためにどの方法を好みますか? フォーマットまたはストリーミング? それは単に好みですか、それとも他のものよりも優れている理由はありますか?またはあなたがそれに使用する特別なライブラリです

編集: c ++の場合は回答してください。

役に立ちましたか?

解決 3

SOCI-The C ++ Database Access Library for C ++

と呼ばれるものがあります。 >

他のヒント

常に" prepare"を使用するprepareStatementと同等のものがありますが、正確な関数名はデータベースとドライバーの組み合わせによって異なります。

execute(String)に対する準備済みステートメントの利点は多数あります:-

ステートメントは解析され、" prepare"文が実行されます。ステートメントを実行する回数に応じて、これは パフォーマンスが大幅に向上します。

パススルー時に文字列データ内の特殊文字を心配する必要はありません setString()。 execute(String)では、データ内の単一引用符またはセミコロンは解析エラーになります。

さらに悪いのは、「SQLインジェクション」の方法です。攻撃が働きます。 cust_tableの" x 'のような文字列の場合cust_tableから削除。選択"データとして入力されると、deleteステートメントが解析および実行される可能性が高くなります。

数値の処理ははるかに効率的です。 setInt呼び出しは、文字列に変換する必要がある同等のSQL文字列のように整数値を取り、DBMSはそれを整数に戻す必要があります。

読みやすさ。一連の文字列の連結を精神的に解析および分析するのとは対照的に、エスケープされた引用符などの余分なノイズとは対照的に、変数が比較的読みやすいいくつかの疑問符で単一のSQL文をコーディングします

ただし、execute(String)が実際に優れている場合がいくつかあります。

鍵が非常に不均一に分散している場所。例えば。顧客の95%が米国に住んでいて、カナダに住んでいる4%をリストしたい場合、「where country =?」;通常、" where country = 'CA'"で表スペーススキャンが行われます。インデックスを使用する可能性があります。

もう1つのケースは、ユーザーが複数の検索条件を入力または省略できる場合です。入力条件の考えられるすべての組み合わせを処理する複雑なクエリを作成するよりも、指定された条件のSQL文字列を作成する方がはるかに優れています。

Javaでは、 PreparedStatementを使用する必要があります。

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();

準備されたステートメントを使用できない場合、クエリを記述する最良の方法はC ++ストリームを使用することです。

std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";

パラメータのタイプと文字列の長さを気にする必要はありません!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top