如何在Linq To SQL中为连接设置ARITHABORT ON

3
默认情况下,OLEDB连接的SQL连接选项ARITHABORT为OFF,我认为Linq To SQL正在使用它。然而,我需要将其设置为ON。原因是我的数据库包含一些索引视图,如果连接没有ARITHABORT ON,则针对索引视图中的表的任何插入/更新/删除操作都会失败。即使使用WITH(NOEXPAND)提示(在SQL标准版中必须使用以获得索引视图的性能优势)对索引视图本身进行选择也会失败。
在数据上下文中是否有地方可以指定我想要此选项为ON?或者在代码中的某个地方可以这样做吗?
我已经实现了一个笨拙的解决方法,但我不喜欢它...我必须为每个select/insert/update/delete操作创建一个存储过程,并在此过程中首先运行SET ARITHABORT ON,然后执行另一个包含实际select/insert/update/delete的过程。换句话说,第一个过程只是第二个过程的包装器。将SET ARITHABORT ON放在select/insert/update/delete代码上面是不起作用的。

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

3
我最终做的是在自己的“帮助程序”类中编写自己的方法来创建数据上下文,并在每次需要数据上下文时使用它,例如:
      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)

这里的想法是使用带有连接参数的数据上下文构造函数。我创建并打开一个SqlConnection,在其上运行“set arithabort…”,然后将其传递给DC(感谢此处的发布者)。


我在处理这个问题时遇到了连接未关闭的情况。你有遇到过这种情况吗?我该怎么避免这种情况发生? - drizzie
不好意思,我没有理解那个问题。也许你可以看一下是否正在处理你的数据上下文? - Laurence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接