Получить префикс параметра в ADO.NET - PullRequest
6 голосов
/ 02 августа 2011

Я хочу сгенерировать несколько операторов 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 ]

4 голосов
/ 02 августа 2011

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

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

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

1 голос
/ 02 августа 2011

Я нашел ответ, но не могу воспроизвести, как я его нашел:

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

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

...