添加SqlCommand参数时应该何时使用“SqlDbType”和“size”?

有一个相关的问题:


将参数传递给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");

在我假设的变量传递中具有字段的长度是不可取的,因为它是可以在数据库中稍后更改的魔术值。它是否正确?它是否会导致以这种方式(性能或其他)传递varchar的任何问题,我假设它默认为varchar(max)或数据库等效。我很高兴这会奏效。


更关心我的部分是如果我使用上面列出的第三或第四个选项,则丢失SqlDbType枚举我根本不提供类型。有没有这种情况不起作用的情况我可以想象varchar被错误地转换为char或者反之亦然的问题或者可能是带有小数的问题....


就数据库而言,我认为字段类型的变化远不如长度,因此值得保留?


元芳怎么了
浏览 485回答 3
3回答

拉风的咖菲猫

通过添加类型,您的请求更有可能通过使用缓存查询计划来提高性能。以下是MSDN的引用:参数化命令还可以提高查询执行性能,因为它们可以帮助数据库服务器将传入命令与正确的缓存查询计划精确匹配。更多内容请参阅执行计划缓存和重用。

凤凰求蛊

本文所描述的是,通过尽可能精确地定义参数,它更有可能是一个缓存的查询计划,它将被使用,然后具有更高的性能。子部分简单参数化说明了这一点:在SQL Server中,在Transact-SQL语句中使用参数或参数标记增加了关系引擎将新SQL语句与现有的先前编译的执行计划相匹配的能力。
打开App,查看更多内容
随时随地看视频慕课网APP