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,信息应该通过提供程序工厂提供.
有 2 个DbCommandBuilder方法可以帮助您,GetParameterName和GetParameterPlaceholder。这些是受保护的,因此您需要进行一些反思才能使用它们。
查看我对以下问题的回答以了解实现(也包含在DbExtensions库中):
你最喜欢的 C# 扩展方法是什么?(codeplex.com/extensionoverflow)
我找到了答案,但我无法重现我是如何找到它的:
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}。我将进一步调查以找出其他架构表列中包含的内容。