Получить префикс параметра в ADO.NET

Я хочу создать несколько операторов 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. Но я использую абстрактные классы в System.Data (DbCommand, DbParameterи т. д.) и различные поставщики данных, такие как Oracle, MySQL, Postgres и т. д., основанные на настройках строки подключения в app.config. Таким образом, мне нужно знать, какой префикс я должен использовать. Для MS-SQL это @Oracle использует :Остальное я на самом деле не знаю.

Есть ли способ получить этот префикс из фабрики провайдеров?

System.Data.SqlClient.SqlClientFactory.InstanceУ меня нет такой информации или, по крайней мере, я не смог ее найти.

В противном случае, вы можете дать мне список общих баз данных?

Изменить: целевые платформы от.NET 2 до.NET 4, и информация должна быть доступна через фабрику провайдера.

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();
}

За SqlCclientparameterMarker является {0} но должно быть @{0}, Я исследую немного больше, чтобы выяснить, что содержится в других столбцах таблицы схемы.

Вам помогут два метода DbCommandBuilder: GetParameterName и GetParameterPlaceholder. Они защищены, поэтому вам нужно немного подумать, чтобы их использовать.

Ознакомьтесь с моим ответом на следующий вопрос для реализации (также включен в библиотеку DbExtensions):

Какие ваши любимые методы расширения для C#? (codeplex.com/extensionoverflow)

Другие вопросы по тегам