连接到数据库后,我可以得到我的SqlDataReader中返回的所有列的名称吗?
连接到数据库后,我可以得到我的SqlDataReader中返回的所有列的名称吗?
受到这个问题的启发,关于SET NOCOUNT有不同的观点…
我们应该使用SET NOCOUNT ON SQL Server吗?如果不是,为什么不是?
它的作用编辑6,2011年7月22日
它在任何DML之后抑制“受影响的xx行”消息。这是一个结果集,当发送时,客户端必须处理它。它很小,但可测量(见下面的答案)
对于触发器等,客户端将收到多个“受影响的xx行”,这将导致一些orm, MS Access, JPA等的各种错误(见下面的编辑)
背景:
一般公认的最佳实践(我认为直到这个问题)是在SQL Server的触发器和存储过程中使用SET NOCOUNT ON。我们到处使用它,快速谷歌显示大量的SQL Server mvp也同意。
MSDN说这会破坏。net SQLDataAdapter。
现在,这对我来说意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它期望匹配“受影响的n行”消息。所以,我不能用:
IF EXISTS以避免重复(没有行影响消息)注意:谨慎使用 WHERE不存在(行数比预期的少 过滤掉琐碎的更新(例如没有数据实际变化) 在之前进行任何表访问(例如日志记录) 隐藏复杂性或去规范化 等
在这个问题中marc_s(谁知道他的SQL东西)说不要使用它。这与我的想法不同(我认为自己在SQL方面也有一定的能力)。
我可能遗漏了一些东西(尽管指出显而易见的事实),但你们怎么看?
注意:我已经好几年没有看到这个错误了,因为我现在不使用SQLDataAdapter。
评论和问题后的编辑:
编辑:更多想法…
我们有多个客户端:一个可能使用c# SQLDataAdaptor,另一个可能使用来自Java的nHibernate。这些可以通过SET NOCOUNT ON以不同的方式受到影响。
如果您将存储的proc视为方法,那么假定某些内部处理以某种方式为您自己的目的是不合适的(反模式)。
编辑2:一个触发中断nHibernate问题,其中SET NOCOUNT ON不能设置
(不,它不是这个的副本)
编辑3:更多信息,感谢我的MVP同事
KB 240882,在SQL 2000和更早的版本上导致断开连接的问题 性能增益演示
编辑4:2011年5月13日
打破linq2 SQL太当没有指定?
编辑5:14 2011年6月
打破JPA,存储过程与表变量:JPA 2.0支持SQL Server表变量吗?
编辑6:15 2011年8月
SSMS“编辑行”数据网格需要SET NOCOUNT ON:用GROUP BY更新触发器
编辑7: 07 Mar 2013
更深入的细节来自@RemusRusanu: SET NOCOUNT ON真的有这么大的性能差异吗
var connection = ConnectionFactory.GetConnection(
ConfigurationManager.ConnectionStrings["Test"]
.ConnectionString, DataBaseProvider);
这是我的app。config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Test" connectionString="Data Source=.;Initial Catalog=OmidPayamak;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
但是当我的项目运行时,这是我的错误:
对象引用未设置为对象的实例。
在以下方面,你如何评价它们:
性能 发展速度 整洁、直观、可维护的代码 灵活性 整体
我喜欢我的SQL,所以一直是ADO的铁杆粉丝。NET和存储过程,但我最近玩了一个Linq to SQL,并被我写出我的DataAccess层的速度所震惊,并决定花一些时间真正理解Linq to SQL或EF…或不?
我只是想确认一下,这些技术中没有什么重大缺陷会让我的研究变得毫无用处。例如,性能很糟糕,对于简单的应用程序来说很酷,但只能到此为止。
更新: 你能专注于EF VS L2S VS SPs而不是ORM VS SPs吗?我主要对EF VS L2S感兴趣。但是我也热衷于将它们与存储的procs进行比较,因为纯SQl是我非常了解的东西。
突然,在实例化生成的ObjectContext类时,我一直得到一个MetadataException。App.Config中的连接字符串看起来是正确的-自从上次它工作以来没有改变-我已经尝试从底层数据库中重新生成一个没有变化的新模型(edmx-file)。
有人有什么想法吗?
进一步的细节:我没有更改任何属性,没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入到程序集中。我只是下班后等了10个小时才回来。然后它就不管用了。
我试过重新创造EDMX。我试着重新创建这个项目。我甚至尝试从头开始重新创建数据库。不管怎样,运气不好。
如何查看实体框架生成的SQL ?
(在我的特殊情况下,我使用mysql提供商-如果它重要)