【发布时间】:2011-06-05 05:15:44
【问题描述】:
有一个相关的问题:
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 参数,我想知道哪种方法最好:
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 而不是适配器的地方获取原始代码块(您确实需要为此打开连接吗?)。这就是顽皮的复制/粘贴编程所得到的:-)。现在在我的代码中修复。
-
我只是想提一下,因为这是“人们可能不知道的晦涩提示”之一
标签: c# .net ado.net sqlcommand