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