Я пишу небольшую платформу на C # для импорта данных в SQL Server.
Я заметил, что если вы попытаетесь использовать? заполнитель для параметров, они не работают, если вы используете пространство имен System.Data.SqlClient.
Однако, если вы используете пространство имен System.Data.OleDb для работы с базой данных, они работают просто отлично. (вам просто нужно добавить Provider = SQLOLEDB в вашей строке подключения)
Итак, у меня есть несколько вопросов, потому что? синтаксис требуется для моего решения:
- Есть ли альтернатива использованию именованных параметров с System.Data.SqlClient? Я хочу использовать упорядоченные параметры.
- Есть ли какое-либо влияние на производительность использования одного пространства имен (провайдер ado) над другим?
- Есть ли какая-то другая причина, по которой я должен предпочесть одно пространство имен другому?
Чтобы пояснить, что я пытаюсь сделать, мой фреймворк собирается взять класс, украшенный некоторыми пользовательскими атрибутами, и генерировать SQL следующим образом:
INSERT INTO myTable (col1, col2, ...) VALUES (?, ?, ...)
Эта строка будет создана с одним IDbCommand и несколькими IDataParameters, и для каждого ExecuteNonQuery она будет просто устанавливать значения в IDataParameters.
Есть мысли?
Редактировать: я пытался использовать именованные параметры как p0, p1 и т. Д., Как упомянул ответчик, и он очень хорошо работает на SqlClient. Однако, если я использую Oledb, он ошибается, говоря:
"Must declare the scalar variable @p0."
Мой параметр создан так:
new OleDbParameter("p" + index, GetType(attribute));
//GetType does work to get the correct SqlDbType
Что не так? Я также попытался добавить и удалить символ @ в имени параметра безрезультатно.
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Я только что использовал Oledb? и SqlClient используют именованные параметры. Я могу менять туда и обратно для новых провайдеров.