2011-08-01 2 views
6

列名をパラメータとして使用して列リストに基づいていくつかのSQL文を生成したいとします。ADO.NETでパラメータ接頭辞を取得

編集:C#

var columns = new string[] { "COL1", "COL2" }; 
var tableName = "TABLE_1"; 
var prefix = "@"; // TODO get this from the provider factory 

string sqlInsert = string.Format(
    "INSERT INTO {0}\n({1}) VALUES\n({2})", 
    tableName, 
    string.Join(", ", columns), 
    string.Join(", ", columns.Select(c => prefix + c))); 

生成されたSQL:

INSERT INTO TABLE_1 
(COL1, COL2) VALUES 
(@COL1, @COL2) 

これは、SqlClientで動作します。しかし、私はSystem.Data(DbCommandDbParameterなど)の抽象クラスと、Oracle、MySQL、Postgresなどのさまざまなデータプロバイダを、app.configの接続文字列設定に基づいて使用しています。したがって、私はどのプレフィックスを使用する必要があるかを知る必要があります。 MS-SQLの場合は@、オラクルは:を使用していますが、実際は分かりません。

このプレフィックス文字をプロバイダファクトリから取得する方法はありますか?

System.Data.SqlClient.SqlClientFactory.Instanceこのような情報はありません、または少なくとも私はそれを見つけることができませんでした。

それ以外の場合は、共通データベースのリストを教えてください。

を編集します。ターゲットプラットフォームは.NET 2から.NET 4で、情報はプロバイダの工場から入手できます。

+0

SQLの生成に使用したコードを提供できますか? – mellamokb

答えて

1

を、私は答えを見つけましたが、私はそれを見つけた方法を再現することはできません。

http://www.codewrecks.com/blog/index.php/2007/09/06/about-parametermarkerformat/

DbConnectionは、コマンドパラメータ名を作成するための正しい書式文字列を含むスキーマテーブルを提供することができます。SqlClientを除いて! SqlCclientparameterMarkerについては

DbProviderFactory myFactory = DbProviderFactories.GetFactory(myProviderName); 

using (DbConnection myConnection = myFactory.CreateConnection()) 
{ 
    myConnection.ConnectionString = mySettings.ConnectionString; 
    myConnection.Open(); 

    string parameterMarker = myConnection 
     .GetSchema(DbMetaDataCollectionNames.DataSourceInformation) 
     .Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat].ToString(); 

    myConnection.Close(); 
} 

{0}ですが@{0}でなければなりません。もう少し調べて、他のスキーマ・テーブルの列に含まれるものを調べてみましょう。

+0

'ParameterMarkerPattern'は' ParameterNamePattern'に '@'がすでに含まれているので、 '{0}'です。 –

関連する問題