これに関連する質問があります:
パラメータを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) またはデータベースと同等であると想定しています。これが機能することをかなり嬉しく思います。
もっと気になる部分は、上記の 3 番目または 4 番目のオプションを使用している場合に SqlDbType 列挙型が失われることです。型をまったく指定していません。これがうまくいかない場合はありますか? varchar が char に誤ってキャストされたり、その逆であるという問題や、10 進数からお金への問題などを想像できます....
データベースに関して言えば、フィールド タイプは長さよりも変更される可能性がはるかに低いので、保持する価値はありますか?