Существует связанный с этим вопрос к этому:Когда следует использовать «SqlDbType» и «размер» при добавлении параметров SqlCommand?
What's the best method to pass parameters to 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.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 или наоборот или, возможно, с десятичным делением на деньги ....
С точки зрения базы данных тип поля, я бы сказал, гораздо меньше шансов на изменение, чем длина, поэтому стоит ли его удержать?
Не отвечая на свой вопрос, вы знаете, что вам не нужно открывать соединение до вызова 'SqlDataAdapter.Fill()', и есть ли в этом преимущества? –
@ Rowland хороший пункт. Я действительно знал, что, хотя это был надзор в моем коде. Я думаю, что я взял исходный блок кода откуда-то, что я использовал SqlDataReader, а не адаптер (вам нужно открыть соединение для этого?). Это то, что вы получаете за непослушные программы копирования/вставки :-). Исправлено в моем коде. – PeteT
просто подумал, что я упоминал об этом, так как это один из тех «неясных советов, которые люди могут не знать о» –