.net - SqlParameter 如何知道类型

标签 .net ado.net sqlparameter

我想知道如何SqlParameter知道没有指定的类型吗?

例如,在实例化参数对象时,您不需要指定 DB 类型。以某种方式执行命令时,.net 会为您处理此问题。在幕后是否有某种转换正在发生?当你做/不明确指定类型时是否有成本?

最佳答案

Is there a cost when you do / don't specify the type explicitly?



是的,而且成本可能很大。它与客户端转换无关,而是与服务器端执行有关。您应该阅读 Under the Table - How Data Access Code Affects Database Performance .可能出现的一些问题是:
  • 使用 NVARCHAR 类型可以否定您的索引。如果您使用 SqlCommand.Parameters.AddWithValue("@someparam", "somestring")结果参数是 NVARCHAR类型。如果您的查询包含子句 WHERE somecolumn = @someparamsomecolumn是 VARCHAR 类型并已索引,则类型不匹配将阻止索引使用。
  • 参数长度计划缓存污染。如果您使用 SqlCommand.Parameters.AddWithValue("@someparam", "somestring")它将导致具有参数类型 NVARCHAR(10) 的查询当您使用 SqlCommand.Parameters.AddWithValue("@someparam", "anotherstring")它将导致查询的参数类型为 NVARCHAR(13)这将被视为不同的查询,并产生不同的计划。随着时间的推移,您可以使用数百个计划来污染服务器计划缓存,每个可能的参数长度都有一个。当存在多个参数时,这种情况可能会加剧,每种长度组合都会创建自己的计划

  • 其他类型也可能存在问题,但字符串是最臭名昭著的罪魁祸首。再次,阅读链接的文章,是高度相关的。

    关于.net - SqlParameter 如何知道类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490005/

    相关文章:

    c# - XmlSerializer 不遵守默认命名空间?

    c# - SQLite/ADO.NET - 数据适配器没有将正确的行数写入 SQLite 文件

    c# - 将 null 作为 SQLParameter DateTime 值传递

    c# - 为什么 SqlParameter 名称/值构造函数将 0 视为 null?

    .net - Windows XP SP2 是否默认包含 .net 框架?

    c# - BufferBlock 和 TPL 数据流行为

    c# - 从 .NET 网络应用程序中删除 ReportViewer,仍在寻找 ReportViewer dll

    c# - System.Data.dll ("Incorrect syntax near ' )'."中的“System.Data.SqlClient.SqlException”)?

    .net - 为EF提供即时的自定义数据库提供程序

    c# - 将多个 SqlParameter 传递给方法