C # - SQL Server -? Параметры и Oledb - PullRequest
2 голосов
/ 01 декабря 2009

Я пишу небольшую платформу на C # для импорта данных в SQL Server.

Я заметил, что если вы попытаетесь использовать? заполнитель для параметров, они не работают, если вы используете пространство имен System.Data.SqlClient.

Однако, если вы используете пространство имен System.Data.OleDb для работы с базой данных, они работают просто отлично. (вам просто нужно добавить Provider = SQLOLEDB в вашей строке подключения)

Итак, у меня есть несколько вопросов, потому что? синтаксис требуется для моего решения:

  1. Есть ли альтернатива использованию именованных параметров с System.Data.SqlClient? Я хочу использовать упорядоченные параметры.
  2. Есть ли какое-либо влияние на производительность использования одного пространства имен (провайдер ado) над другим?
  3. Есть ли какая-то другая причина, по которой я должен предпочесть одно пространство имен другому?

Чтобы пояснить, что я пытаюсь сделать, мой фреймворк собирается взять класс, украшенный некоторыми пользовательскими атрибутами, и генерировать 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 используют именованные параметры. Я могу менять туда и обратно для новых провайдеров.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2009

Это поведение этих классов. OleDb использует?, SqlClient именованный параметр.

Производительность: у меня нет тестов, но я думаю, что SqlClient должен работать лучше с Sql Server, чем OleDB. SqlClient явно для Sql Server, OleDB для любого типа источника данных (даже Excel). Но пожалуйста. попробуй это.

С SqlClient вы также можете иметь «упорядоченный параметр». Просто позвоните вам параметр @ Param1, @ Param2, @ Param3 ....

0 голосов
/ 01 декабря 2009

Вы можете использовать это как ссылку для параметров

Свойство SqlCommand.Parameters

...