2010-08-19 4 views
0

Интересно, может ли кто-нибудь помочь?.Net SQLCommand не работает при выполнении хранимой процедуры, которая не возвращает записей

У меня проблема с объектом SqlCommand, что при выполнении хранимой процедуры, которая не возвращает записей, будет тайм-аут.

Хранимая процедура не является сложной задачей, это всего лишь простая вещь SELECT ColumnA, ColumnB, ... FROM TableA WHERE Id = @Id. Если я запустил SP в Sql Managment Studio, он вернется в мгновение ока.

Однако, когда я пытаюсь выполнить команду для заполнения DataAdapter или выполнить команду вручную из «Immediate Window» - после ее создания и заполнения параметров, он будет всегда тайм-аут.

Я использую метод DerivParameters() SqlCommandBuilder для заполнения параметров SqCommand, а затем итерацию по коллекции и заполнение значений. Затем я устанавливаю DataAdapter.SelectCommand в ссылку SqlCommand и вызываю метод заполнения DataAdapter.

Код, кажется, работает нормально с любым SP, который возвращает данные, но baulks, когда строки не возвращаются.

Неужели кто-то испытал это и может указать мне в правильном направлении, пожалуйста?

Заранее спасибо, С уважением, Duane.

+1

Приведенный ниже ваш код поможет нам дать вам ответ. – LukeH

ответ

0

найдите свойство timeout команды и установите его значение равным нулю.

Dim cmd As SqlCommand 

    cmd = New SqlCommand 
    cmd.CommandText = spName 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Connection = _sqlConn 
    cmd.CommandTimeout = 0 
+0

Hi Beth, Спасибо за ваш совет. В этом случае свойство timeout команды было установлено на 15 секунд, и запрос при запуске в SSMS запускается мгновенно. Это было только при запуске из кода, который он время от времени. – Dib

1

В конце концов выяснилось, что другая часть кода открыла транзакцию в записи, которую мы читали.

Причина для нескольких соединений с базой данных заключается в том, что в настоящее время в проекте используются ADO и ADO.Net (это очень большой проект и в настоящее время находится в процессе преобразования из VB6 в .Net. устаревший доступ к данным с использованием ADO). Соединение ADO открыло транзакцию, и новое соединение ADO.Net не удалось прочитать, пока транзакция не завершится, что произойдет только после того, как команда ADO.Net была отключена, и ошибка была сброшена, а транзакция ADO откатна!

Doh!

Спасибо всем, кто прочитал и подумал о решении. Спасибо Бет за ее предложение.

С уважением, Duane.

+0

Хороший улов. :) Спасибо за отправку вашего решения в конце. Я изменил SP в транзакции, и DeriveParameters сам выбрал время. – Jonathan

0
com = new SqlCommand("insert1",con); 

com.CommandType = System.Data.CommandType.StoredProcedure; 

com.Parameters.Add("@eno",eno.Text); 
com.Parameters.Add("@ename",ename.Text); 
com.Parameters.Add("@sal",sal.Text); 
Response.Write(com.ExecuteNonQuery().ToString()); 
+1

Добро пожаловать в SO. Пожалуйста, объясните свой код в своих ответах. – Tim