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

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

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

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

42
задан Community 23 May 2017 в 12:33
поделиться