我想使用列名作为参数基于列列表生成多个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)));

生成的SQL:
INSERT INTO TABLE_1
( COL1,  COL2) VALUES
(@COL1, @COL2)

这适用于SqlClient。但是我正在基于app.config中的连接字符串设置使用System.Data中的抽象类(DbCommandDbParameter等)以及不同的数据提供程序,例如Oracle,MySQL,Postgres等。因此,我需要知道必须使用哪个前缀。对于MS-SQL,它是@,Oracle使用:,其余的我实际上是不知道的。

有没有办法从提供程序工厂获取此前缀字符?
System.Data.SqlClient.SqlClientFactory.Instance没有这样的信息,或者至少我找不到它。

否则,可以给我列出常用数据库吗?

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

最佳答案

有2种DbCommandBuilder方法可以帮助您,GetParameterNameGetParameterPlaceholder。这些是 protected ,因此您需要进行一些反射(reflection)才能使用它们。

查看我对以下问题的回答,以获取实现(也包括在DbExtensions库中):

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

09-07 01:42