2009-03-19 4 views
0

Я пытаюсь вставить строку в таблицу, используя простой запрос INSERT в транзакции. Он отлично работает в SQL Server, но я не могу вставить данные с помощью моего бизнес-объекта.

Я звоню запрос на выборку с помощью команды, как:Timeout Expire on INSERT Query

Using cm As New SqlCommand 
    With cm 
     .Connection = tr.Connection 
     .Transaction = tr 
     .CommandType = CommandType.Text 
     .CommandText = Some Select Query 
     .ExecuteScalar() 
     '' Do something 

     .CommandText = Insert Query 
     .ExecuteNonQuery() 
    End With 
End Using 

Я получаю тайм-аута истек ошибки в «.ExecuteNonQuery()» линии.

В этот момент любой другой запрос DML работает отлично.

Может ли кто-нибудь сказать мне причину?

+0

Вы можете разместить больше информации? У меня есть инструкции по разъяснению вашего вопроса с медленным запросом здесь: http://www.brentozar.com/archive/2009/03/getting-help-with-a-slow-query/ –

+0

Спасибо всем за ваши собеседники. Однако у меня есть решение. Я использовал вложенные Sqltransactions в своих бизнес-объектах. –

ответ

0

Management Studio имеет свои подключения, установленные не на тайм-аут, что может объяснить, почему он работает там. Вы можете сделать это в своем коде, установив для свойства .Timeout вашего соединения значение 0. Однако это не рекомендуется, если вы не знаете .

Вместо этого нам нужно выяснить, что так долго. Выполняется ли запрос студии управления длительное время? Может ли он ждать транзакции? Можете ли вы профайл узнать, где приложение тратит время?

+0

SqlConnection.ConnectionTimeout Свойство доступно только для чтения. Кроме того, я не вызывал Transaction.Commit(). Он будет вызываться после этого запроса INSERT. Интересная вещь: у меня есть еще один подобный бизнес-объект, где INSERT выполняется правильно. –

0

Похоже, что ваш запрос использует плохой план запроса. Попробуйте установить ARITHABORT ON, и это должно обойти план запроса:

Dim arithabortCmd As New SqlCommand("SET ARITHABORT ON", cn) 
arithabortCmd.ExecuteNonQuery() 

Я хотел бы убедиться, что индексы базы данных обновляется путем выполнения этого SQL в базе данных:

-- Execute this to rebuild all for a given database. Replace the <databasename> after EXEC. 
EXEC <databasename>..sp_MSforeachtable @command1='DBCC DBREINDEX (''*'')', @replacechar='*' 
+1

SET ARITHABORT ON делает то, что вы говорите? Справка...? – gbn