[c#] Когда следует использовать «SqlDbType» и «размер» при добавлении параметров SqlCommand?


0 Answers

Добавляя тип, ваши запросы, скорее всего, повысят производительность за счет использования кэшированного плана запросов.

Вот цитата из MSDN:

Параметрированные команды также могут повысить производительность выполнения запросов, поскольку они помогают серверу базы данных точно соответствовать входящей команде с надлежащим кэшированным планом запросов.

Подробнее читайте в разделе «Кэширование и повторное использование плана выполнения» .

Question

К этому относится связанный с этим вопрос:

Каков наилучший способ передать параметры SQLCommand?

Но я хочу знать, каковы различия, и если есть какие-то проблемы с разными способами.

Обычно я использую структуру что-то вроде этого:

using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(SQL, conn))
{
     cmd.CommandType = CommandType.Text;
     cmd.CommandTimeout = Settings.Default.reportTimeout;
     cmd.Parameters.Add("type", SqlDbType.VarChar, 4).Value = type;

     cmd.Connection.Open();

     using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
     {
         adapter.Fill(ds);
     }
      //use data                    
}

Теперь есть несколько способов добавить параметры cmd, и мне интересно, что лучше:

cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
cmd.Parameters.Add("@Name").Value = "Bob";
cmd.Parameters.AddWithValue("@Name", "Bob");

Предполагаю, что длина поля при передаче varchars не предпочтительнее, поскольку это волшебное значение, которое может быть изменено позже в базе данных. Это верно? Это вызывает любую проблему, передающую varchar таким образом (производительность или другое), я предполагаю, что по умолчанию используется varchar (max) или эквивалент базы данных. Я достаточно рад, что это сработает.

Часть, которая меня больше интересует, это потеря перечисления SqlDbType, если я использую третий или четвертый варианты, перечисленные выше. Я вообще не предоставляю тип. Есть случаи, когда это не сработает, я могу представить, что проблемы с varchar некорректно передаются на char или наоборот или, возможно, с десятичным делением на деньги ....

Что касается базы данных, тип поля, который я бы сказал, гораздо реже менялся, чем длина, поэтому стоит ли его сохранить?




Related