【问题标题】:How to SET ARITHABORT ON for connections in Linq To SQL如何为 Linq To SQL 中的连接设置 ARITHABORT ON
【发布时间】:2011-02-27 13:38:17
【问题描述】:

默认情况下,对于 OLEDB 连接,SQL 连接选项 ARITHABORT 是关闭的,我假设 Linq To SQL 正在使用它。但是我需要它打开。原因是我的数据库包含一些索引视图,如果连接没有 ARITHABORT ON,则对属于索引视图一部分的表的任何插入/更新/删除操作都会失败。如果使用 WITH(NOEXPAND) 提示(您必须在 SQL 标准版中使用它来获得索引视图的性能优势),即使对索引视图本身进行选择也会失败。

我可以在数据上下文中的某个地方指定我希望启用此选项吗?或者在代码中的某个地方我可以做到吗??

我已经管理了一个笨拙的解决方法,但我不喜欢它....我必须为每个选择/插入/更新/删除操作创建一个存储过程,并且在这个过程中首先运行 SET ARITHABORT ON,然后执行另一个包含实际选择/插入/更新/删除的过程。换句话说,第一个 proc 只是第二个的包装器。将 SET ARITHABORT ON 放在 select/insert/update/delete 代码上方是行不通的。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?如果晚于 SQL2000,它不应该关心这个,除非 ANSI_WARNINGS 也关闭(除非你的数据库在 SQL 2000 兼容级别)sqlblog.com/blogs/kalen_delaney/archive/2008/06/19/…
  • 它的 SQL 2005。是的,对于通过 Management Studio 运行的手动查询,它会自动打开,但 OLEDB 已将其关闭(因此,如果您正在编写应用程序,该设置将关闭应用程序的 SQL 连接)。
  • 劳伦斯,您确定 OLE DB 连接明确关闭此设置吗? ALTER DATABASE 的文档并没有说它确实如此(NUMERIC_ROUNDABORT 也没有),但确实声明了针对 ODBC 和 OLE DB 客户端的其他选项。我通过 .NET (OLE DB) 和 SQLCMD.EXE (ODBC) 进行了测试,它们都不需要ARITHABORT 的任何设置,以便我选择和更新索引视图。您在回答中提到的帮助类之前是否遇到错误?
  • 异常发生在对作为索引视图一部分的表运行插入/更新/删除操作,而不是视图本身。我只能说我在使用 Linq to SQL 时遇到了这个问题,后来也遇到了 Entity Framework 的问题。

标签: linq-to-sql arithabort


【解决方案1】:

我最终做的是在我自己的“帮助器”类中编写自己的方法来创建数据上下文,并在每次需要数据上下文时使用它,例如

      Dim conn As New SqlConnection(Config.GetConnectionString("SiteSqlServer"))
      Dim command As New SqlCommand("set arithabort on;", conn)
      command.Connection.Open()
      command.ExecuteNonQuery()
      Dim dc = New SiteDataContext(conn)

这里的想法是使用将连接作为参数的 datacontext 构造函数。我创建并打开一个 SqlConnection,在其上运行“set arithabort...”,然后将其传递给 DC(归功于海报here)。

【讨论】:

  • 我在保持连接打开时遇到了问题。你遇到过这个吗?我该怎么做才能避免这种情况。
  • 不,抱歉,我没有收到这个问题。也许看看你是否正在处理你的数据上下文?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多