在ADO.NET中获取参数前缀

mat*_*zek 6 .net database ado.net factory abstract

我想使用列名作为参数,基于列列表生成多个SQL语句.

编辑: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)));
Run Code Online (Sandbox Code Playgroud)

生成的SQL:

INSERT INTO TABLE_1
( COL1,  COL2) VALUES
(@COL1, @COL2)
Run Code Online (Sandbox Code Playgroud)

这适用于SqlClient.但是我使用抽象类System.Data( ,DbCommand,DbParameter等),并根据在App.config的连接字符串设置不同的数据提供商如Oracle,MySQL和Postgres的等.因此,我需要知道我必须使用哪个前缀.对于MS-SQL,它是@,Oracle使用的:,其余的我实际上不知道.

有没有办法从提供程序工厂获取此前缀字符?

System.Data.SqlClient.SqlClientFactory.Instance没有这样的信息或者至少我找不到它.

否则,你能给我一个公共数据库列表吗?

编辑:目标平台是.NET 2到.NET 4,信息应该通过提供程序工厂提供.

Max*_*oro 5

有 2 个DbCommandBuilder方法可以帮助您,GetParameterNameGetParameterPlaceholder。这些是受保护的,因此您需要进行一些反思才能使用它们。

查看我对以下问题的回答以了解实现(也包含在DbExtensions库中):

你最喜欢的 C# 扩展方法是什么?(codeplex.com/extensionoverflow)


mat*_*zek 2

我找到了答案,但我无法重现我是如何找到它的:

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

DbConnection 可以提供一个架构表,其中还包含用于创建命令参数名称的正确格式字符串,SqlClient 除外!

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();
}
Run Code Online (Sandbox Code Playgroud)

因为SqlCclient parameterMarker{0}但应该是@{0}。我将进一步调查以找出其他架构表列中包含的内容。