6

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

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

4

4 に答える 4

6

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

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

「prepare」ステートメントが実行されると、ステートメントが解析され、アクセス プランが 1 回だけ決定されます。ステートメントを実行する回数によっては、パフォーマンスが大幅に向上する可能性があります。

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

さらに悪いことに、これが「SQL インジェクション」攻撃のしくみです。"x' from cust_table; delete from cust_table; select " のような文字列がデータとして入力された場合、delete ステートメントが解析されて実行される可能性があります。

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

読みやすさ。一連の文字列連結を精神的に解析して分析すると、エスケープされた引用符などの余分なノイズが発生するのとは対照的に、変数が移動する場所にいくつかの疑問符を付けて単一の SQL ステートメントをコーディングすると、比較的読みやすくなります。

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

キーが非常に不均一に分散されている場所。例: 顧客の 95% が米国に住んでいて、カナダに住んでいる 4% をリストしたい場合、"where country = ?" と入力します。「where country = 'CA'」を使用すると、インデックスを使用する可能性がありますが、通常はテーブル スペース スキャンになります。

もう 1 つのケースは、ユーザーが複数の検索基準を入力または省略できる場合です。入力基準のすべての可能な順列に対処する複雑なクエリを作成するよりも、与えられた基準に対して SQL 文字列を作成する方がはるかに優れています。

于 2009-01-05T13:42:39.187 に答える
4

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

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();
于 2009-01-05T09:25:29.817 に答える
1

SOCI - The C++ Database Access Library for C++と呼ばれるものがあります。

于 2009-01-13T13:04:33.090 に答える
1

プリペアド ステートメントを使用できない場合、C++ ストリームを使用するのがクエリを記述する最良の方法であることがわかりました。

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

パラメーターの型や文字列の長さを気にする必要がないのは素晴らしいことです。

于 2009-01-06T23:16:14.350 に答える