C ++ OTL SQLデータベースライブラリは、フードの下にパラメーター化されたクエリを使用していますか、それとも文字列concatですか?
-
01-10-2019 - |
質問
C ++データベースアクセスのために、OTL(Oracle、ODBC、DB2-CLIテンプレートライブラリ)を見てきました。私が渡すクエリが基礎となるデータベースのパラメーター化されたクエリに変換されるかどうか、または基本的にすべての引数を1つの大きな文字列に連結してクエリをそのようにデータベースに渡すかどうかはわかりません。あなたがそれに渡すクエリには、引数のタイプ情報が含まれることがありますが、当時とデータベースにヒットしたクエリの間で何が起こるかはわかりません。
解決
私の電子メールに対するOTL著者の応答:
OTLは、プレースホルダーとともにDB APIレイヤーにクエリを渡します。実際のバインド変数の命名規則は、異なるDBタイプで異なります。オラクルのために、
SELECT * FROM staff WHERE fname=:f_name<char[20]>
翻訳されます:
SELECT * FROM staff WHERE fname=:f_name
さらに、ホスト変数バインドコールの束。
MS SQL Server、またはDB2の場合、同じ選択が次のようになります。
SELECT * FROM staff WHERE fname=?
マニュアルでは、MS SQL、DB2について同じ名前のプレースホルダーを持つことができないと説明しています。プレースホルダー /バインド変数を使用したSQLステートメントは、作成するのに比較的高価です。したがって、OTL_STREAMを介してパラメーター化されたSQLをインスタンス化すると、可能な限りストリームを再利用することは理にかなっています。
さらに質問がある場合、またはOTLマニュアルを改善する方法についての提案がある場合は、お気軽にメールでお問い合わせください。
乾杯、セルゲイ
Pheadbaqは書いた:
こんにちは、私は最近、私が構築したいORMライブラリのベースとして使用するために最近C ++ DBライブラリを評価してきました。ちなみにとても素敵に見え、私が持っているほとんどのニーズを満たすようです。ドキュメントを読んで明確にすることができないように見える長引く質問があります。 OTLは、基礎となるDBMSにパラメーター化されたクエリを渡すのですか、それともOTLストリームに渡されて引数とクエリを単一の文字列に渡してDBMSに渡しますか?
言い換えれば、私がこのMSSQLクエリを渡した場合、bind変数として文字列「bob」とともに:
SELECT * FROM staff WHERE fname = :f_name<char[20]>
OTLパーサーはこれを生成しますか:
SELECT * FROM staff WHERE fname = 'Bob'
またはこれ:
SELECT * FROM staff WHERE fname = @f_name
パラメーターとしての私の文字列とともに
あなたがそこに応答することを気にするなら、私はこの同じ質問をstackoverflow.comに投稿しました:C ++ OTL SQLデータベースライブラリは、フードの下にパラメーター化されたクエリを使用していますか、それとも文字列concatですか?
お時間をいただきありがとうございます
他のヒント
ドキュメント バインド変数についてすべて話します。私は図書館だと思います は クエリを書き換えますが、おそらくBIND変数の形式をDBMSが期待する形式に変更してから、値をバインド変数にバインドするだけです。