2010-06-03 2 views
3

По умолчанию опция подключения SQL ARITHABORT отключена для подключений OLEDB, которые, как я полагаю, использует Linq To SQL. Однако мне нужно, чтобы он был включен. Причина в том, что моя БД содержит некоторые индексированные представления, и любые операции вставки/обновления/удаления с таблицами, которые являются частью индексированного представления, не выполняются, если в соединении нет ARITHABORT ON. Даже выборки против самого индексированного представления выходят из строя, если используется подсказка WITH (NOEXPAND) (которую вы должны использовать в SQL Standard Edition, чтобы получить преимущества производительности индексированного представления).Как установить ARITHABORT ON для соединений в Linq To SQL

Есть ли где-то в контексте данных, которые я могу указать, я хочу, чтобы эта опция включена? Или где-то в коде я могу это сделать ??

У меня есть неудобное обходное решение, но мне оно не нравится .... Мне нужно создать хранимую процедуру для каждой операции select/insert/update/delete, и в этом proc сначала запустите SET ARITHABORT ON, затем выполните другой proc, который содержит фактический выбор/вставка/обновление/удаление. Другими словами, первый proc - это всего лишь оболочка для второго. Не стоит просто устанавливать SET ARITHABORT ON над кодом select/insert/update/delete.

+0

Какую версию SQL Server вы используете? Если позднее SQL2000 это не должно заботиться об этом, если только ANSI_WARNINGS не выключен (если у вас нет базы данных на уровне совместимости SQL 2000) http://sqlblog.com/blogs/kalen_delaney/archive/2008/06/19/ things-keep-change.aspx –

+0

Его SQL 2005. Да, он автоматически запускается вручную с помощью Management Studio, но OLEDB отключается (поэтому, если вы пишете приложение, параметр будет отключен для SQL-соединений приложения). – Laurence

+0

Лоуренс, вы уверены, что соединения OLE DB явно отключили этот параметр? Документация для [ALTER DATABASE] (https://msdn.microsoft.com/en-us/library/bb522682.aspx) не говорит, что она делает (или для 'NUMERIC_ROUNDABORT'), но все же указывает, что другие параметры явно указано для клиентов ODBC и OLE DB. Я тестировал через .NET (OLE DB) и SQLCMD.EXE (ODBC), и ни один из них не требовал установки «ARITHABORT» для того, чтобы я мог SELECT и UPDATE индексированный вид. Получали ли вы ошибку до выполнения вспомогательного класса, как указано в вашем ответе? –

ответ

3

Что я в итоге сделал, это написать собственный метод в моем собственном классе «помощник», чтобы создать datacontext и использовать его каждый раз, когда мне нужен datacontext, например.

 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).

+0

У меня проблемы с открытием этих открытых соединений. Вы столкнулись с этим? Чего я могу избежать. – drizzie

+0

Не жалко, я не получил эту проблему. Может быть, посмотрите, удаляете ли вы свой файл данных? – Laurence