Получить префикс параметра в 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();
}
За SqlCclient
parameterMarker
является {0}
но должно быть @{0}
, Я исследую немного больше, чтобы выяснить, что содержится в других столбцах таблицы схемы.
Вам помогут два метода DbCommandBuilder: GetParameterName и GetParameterPlaceholder. Они защищены, поэтому вам нужно немного подумать, чтобы их использовать.
Ознакомьтесь с моим ответом на следующий вопрос для реализации (также включен в библиотеку DbExtensions):
Какие ваши любимые методы расширения для C#? (codeplex.com/extensionoverflow)