我想使用列名作为参数基于列列表生成多个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中的抽象类(
DbCommand
,DbParameter
等)以及不同的数据提供程序,例如Oracle,MySQL,Postgres等。因此,我需要知道必须使用哪个前缀。对于MS-SQL,它是@
,Oracle使用:
,其余的我实际上是不知道的。有没有办法从提供程序工厂获取此前缀字符?
System.Data.SqlClient.SqlClientFactory.Instance
没有这样的信息,或者至少我找不到它。否则,可以给我列出常用数据库吗?
编辑:目标平台是.NET 2到.NET 4,并且该信息应可通过提供程序工厂获得。
最佳答案
有2种DbCommandBuilder方法可以帮助您,GetParameterName和GetParameterPlaceholder。这些是 protected ,因此您需要进行一些反射(reflection)才能使用它们。
查看我对以下问题的回答,以获取实现(也包括在DbExtensions库中):
What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)