Jest powiązany z tym pytanie:Kiedy należy używać "SqlDbType" i "size" podczas dodawania parametrów SqlCommand?
What's the best method to pass parameters to SQLCommand?
Ale ja chce wiedzieć jakie są różnice i czy są jakieś problemy z różnych sposobów.
Zwykle używam strukturę coś takiego:
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
}
Obecnie istnieje kilka sposobów dodawania CMD parametry i zastanawiam się, który jest najlepszy:
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");
uwzględniając długość pole przy przechodzeniu przez varchary zakładam, że nie jest lepsze, ponieważ jest to magiczna wartość, którą można później zmienić w bazie danych. Czy to jest poprawne? Czy to powoduje problem przechodzący varchar w ten sposób (wydajność lub inne), domyślam się, że domyślnie varchar (max) lub ekwiwalent bazy danych. Jestem całkiem zadowolony, że to zadziała.
Częścią, która mnie bardziej niepokoi jest utrata wyliczenia SqlDbType, jeśli korzystam z trzeciej lub czwartej opcji wymienionej powyżej, w ogóle nie dostarczam typu. Czy są przypadki, w których to nie zadziała Mogę sobie wyobrazić problemy z niepoprawnym rzutowaniem varchar na char lub vice versa lub z dziesiętną na pieniądze ...
Pod względem bazy danych typ pola, który chciałbym powiedzieć, to znacznie mniej prawdopodobne, aby zmienić niż długość, więc czy warto go zatrzymać?
Nie odpowiadając na twoje pytanie, wiesz, że nie musisz otwierać połączenia przed wywołaniem 'SqlDataAdapter.Fill()', i że nie ma takiej możliwości? –
@Rowland dobry punkt. Wiedziałem, że chociaż było to niedopatrzenie w moim kodzie. Myślę, że wziąłem oryginalny blok kodu skądś, że używałem SqlDataReader, a nie adaptera (musisz otworzyć połączenie dla tego prawa?). To właśnie dostajesz za niegrzeczne kopiowanie/programowanie :-). Naprawiono teraz mój kod. – PeteT
po prostu pomyślałem, że wspomnę o tym, ponieważ jest to jedna z tych "nieznanych wskazówek, o których ludzie mogą nie wiedzieć" –