Имеет ли значение порядок объявления параметра SqlCommand и CommandText?

#c# #sql-server

#c# #sql-сервер

Вопрос:

Я использую SqlCommand объект для чтения из / записи в мою базу данных. Я знаю, что использование SQL-команд, подобных приведенным ниже, может привести к проблемам:

 Select * from myTable where tableId = '"   tableID   "'";
  

Вместо этого я использовал предпочтительный метод команд, такой как:

 Select * from myTable where tableId = @Table_ID";
  

Затем создайте мои параметры:

 sqlCommand.Parameters.Add("@Table_ID", SqlDbType.VarChar, 50).Value = tableID;
  

У меня есть два вопроса:

  1. Важен ли порядок добавления моих параметров к SqlCommand объекту?

  2. Нужно ли мне добавлять свою SqlCommand.CommandText строку перед добавлением своих параметров?

Я всегда сначала добавлял свой CommandText , а затем добавлял свои параметры в порядке их использования в строке SQL, но бывают случаи, когда я хотел бы выбрать одну из двух разных строк SQL (пример: вставить или обновить), но затем добавить все параметры после инструкции «If» вместо того, чтобы вкладывать их внутрь нее.

Комментарии:

1. SqlCommand основано на ADO.NET технология — и параметры SQL Server являются именованными параметрами — так что нет, последовательность, в которой вы добавляете их в SqlCommand.Parameters коллекцию, не имеет значения. И также: инициализация CommandText не зависит от параметров — вы можете сделать это до или после — не имеет значения. Все это объединяется во время выполнения запроса. OleDB (для доступа, например, к MS Access с помощью OleDbCommand класса), однако, использует позиционные параметры , а не именованные — там важен порядок!

2. Вероятно, вам следует уточнить, что ваш вопрос специфичен для SQL Server (это выглядит именно так), поскольку вопрос о порядке параметров, похоже, зависит от этого, согласно комментарию @marc_s.

3. @CoolBots: использование SqlCommand подразумевает, что SQL Server — SqlCommand и связанные с ним классы являются ТОЛЬКО SQL Server ….

4. @marc_s это хороший довод! В вашем комментарии упоминался Доступ, что вызвало у меня сомнения, лол. Хотя, спасибо за комментарий — я не знал, OleDbCommand что это только позиционные параметры.

5. Также, ИМХО, при использовании хранимых процедур здесь можно перечислить много преимуществ относительно того, зачем их использовать.

Ответ №1:

  1. Нет, параметры не обязательно добавлять в том порядке, в котором они отображаются в тексте, если они называются parameters

  2. Нет необходимости добавлять CommandText в SqlCommand перед параметрами

Ответ №2:

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

Порядок параметров не важен, если вы используете именованные параметры, такие как @Table_ID, как вы, кажется, делаете. Порядок важен, если вы используете позиционные параметры.

Это зависит от используемого вами клиента доступа к данным.

System.Data.SqlClient: Использует именованные параметры в формате @parametername.

System.Data.OleDb: использует позиционные маркеры параметров, обозначенные вопросительным знаком (?).

System.Data.Odbc: использует позиционные маркеры параметров, обозначенные вопросительным знаком (?).

System.Data.OracleClient: Использует именованные параметры в формате:parmname (или parmname).

Да, вы можете задать текст команды условно (вставить или обновить), а затем добавить параметры вне условия.

Комментарии:

1. Почему вам нужно сначала инициализировать команду текстом command?