4

ADO.NETでコーディングしているC#アプリケーションがあります。IDbCommand、およびIDbConnectionインターフェイスを使用して、クロスデータベースコードを作成 してきました。

これまでのところ、すべてがうまく機能しています(Firebird、SQLite、SQL Server 2005、2008、Access 2007、Access 2010、およびOracle 11g全体)。

私が抱えている問題は、サポートする必要のあるOr​​acle10gデータベースがあることです。

すべての「通常の」もの、接続の作成、およびコマンドは正常に機能しますが、インターフェイスを使用してパラメーターを作成しようとするIDataParametercmd.CreateParamater()、クエリのパラメーター構文が原因で10gで失敗します(パラメーター化されたクエリを使用しています)。

どうやら、Oracle 10gは、箱から出して、@記号の使用をサポートしていません。Oracle 11g、SQL Server、および言及されている他のすべてのものはそうです。

たとえば、次のクエリは10gで失敗します。

select * from Products where ProductId = @ProductId

ただし、コロンを使用すると、上記のado.netインターフェイスを使用して問題なく成功するため、このクエリは成功します。

select * from Products where ProductId = :ProductId

残念ながら、コロンは他のほとんどのデータベース実装では機能しません。

@または、パラメータの区切り文字の代わりに区切り文字を使用できるようにする、Oracle10gデータベースで反転できるオプションはありますか:

私が持っている現在の解決策は理想的とは言えません。顧客/クライアントがプロパティを初期化しParameterDelimiter(デフォルトでは@記号になっています)、を使用してstring.Formatを挿入しParameterDelimiterます。

顧客に区切り文字を渡さなくても、またはベースライブラリにデータベースの実装について知らせずに、これを行うための標準的な方法はありますか?(たとえば、ODP.NETを含め、に対してチェックしますOracleConnection

4

1 に答える 1

8

それが価値があるもののために、私はこの投稿を見つけました:

どのパラメータマーカーを使用する必要がありますか?ADO.NET 2.0、SQL Server @、Oracle :(リンクが無効です)

この質問で言及された:

ADO.NETでパラメータープレフィックスを取得します

次のコードを使用して、接続オブジェクトに情報を「要求」します。

string format = connection
  .GetSchema("DataSourceInformation")
  .Rows[0]["ParameterMarkerFormat"]
  .ToString();

したがって、これは「これを行うための標準的な方法」であり、顧客に情報を渡させたり、データベースの実装について知らなくてもかまいません。

{0}編集:System.Data.SqlClient.SqlConnectionが。の代わりに明らかに返されることを追加する必要があります@{0}

于 2011-12-17T16:38:10.783 に答える