Проблема с SqlCommand C#

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

Сообщение об ошибке:

В экземпляре объекта не задана ссылка на объект. Трассировка стека:
в System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

Я теряюсь в том, почему ..

sqlcon = new SqlConnection(strSqlconnection);

SqlCommand sqlcomSMCheckin = new SqlCommand("prc_CheckIn", sqlcon);

sqlcomSMCheckin.CommandType = CommandType.StoredProcedure;

sqlcomSMCheckin.Parameters.Add("@Description", SqlDbType.VarChar).Value = "My App";

sqlcomSMCheckin.CommandTimeout = this.iCommandTimeOut;

if (sqlcon.State == ConnectionState.Closed)
{
   sqlcon.Open();
}

if (sqlcomSMCheckin != null)
{
    sqlcomSMCheckin.ExecuteNonQuery(); // error here
    sqlcomSMCheckin.Dispose();
}

person Community    schedule 12.06.2009    source источник
comment
И вы на 100% уверены, что подключаетесь к правильной базе данных? Как выглядит ваша строка подключения? Вы пытались указать dbo.prc_CheckIn ??   -  person marc_s    schedule 12.06.2009
comment
да, sp запускается каждые 20 секунд, в другое время я не получаю эту ошибку.   -  person    schedule 12.06.2009
comment
Тогда что изменилось с тех пор??   -  person marc_s    schedule 12.06.2009


Ответы (6)


Является ли sqlCon переменной уровня класса, есть ли у вас проблемы с вызовом одного и того же метода несколько раз? Есть ли что-нибудь статичное в классе? Вы используете несколько потоков?

person cjk    schedule 12.06.2009
comment
Это было оно. Обертывание его в использование определенно помогло, но глупый я пропустил что-то настолько очевидное. Спасибо, ck, что указали на это.. Выполнял процесс все выходные, но ошибки не было. - person ; 15.06.2009

HI

Код выглядит нормально (я рекомендую вам использовать предложение using, как показано в предыдущем ответе). Интересно, проблема не в хранимой процедуре? Попробуйте отладить ее или, по крайней мере, добавить запись в журнал в начале и в конце хранимой процедуры, чтобы убедиться, что она каждый раз завершается нормально.

person MP.    schedule 12.06.2009
comment
Это хорошая идея — помните, что ошибка, которую вы видите, иногда является результатом более глубокой ошибки, которая возникла до того момента, когда о ней сообщается. В этом случае, поскольку код обычно работает, следует смотреть на внешние (базовые) воздействия. - person Doug L.; 12.06.2009

Не уверен на 100%, что здесь происходит, но можете ли вы попробовать этот фрагмент кода?

using(sqlcon = new SqlConnection(strSqlconnection))
{
   using(SqlCommand sqlcomSMCheckin = new SqlCommand("dbo.prc_CheckIn", sqlcon))
   {
       sqlcomSMCheckin.CommandType = CommandType.StoredProcedure;

       sqlcomSMCheckin.Parameters.Add("@Description", SqlDbType.VarChar, 50)
            .Value = "My App";

       sqlcomSMCheckin.CommandTimeout = this.iCommandTimeOut;

       sqlcon.Open();
       sqlcomSMCheckin.ExecuteNonQuery();
       sqlcon.Close();
   }
}

Я заменяю "prc_CheckIn" на "dbo.prc_CheckIn", указываю максимальную длину в параметре VARCHAR (настраиваю по мере необходимости), заворачиваю все в блоки с помощью {} - вот и все.

Вы все еще получаете ту же ошибку ??

Марк

person marc_s    schedule 12.06.2009
comment
ага. Сделал все упомянутые изменения, и я все еще получаю сообщение об ошибке. добавлена ​​квалификация базы данных также для sp. Итак, теперь это abc.dbo.prc_CheckIn. Код запускается каждые 20 секунд, и он работает нормально в течение нескольких минут, а затем внезапно я получаю это. Я должен упомянуть, что метод, в котором находится этот код, используется несколькими потоками. - person ; 12.06.2009

Убедитесь, что sproc «prc_CheckIn» существует на сервере SQL, к которому вы подключаетесь. Возможно, он написан с ошибкой и/или недоступен для пользователя в соединении.

person Marc    schedule 12.06.2009
comment
prc_ChecIn существует. Этот фрагмент кода работает без проблем, за исключением того, что иногда я получаю эту ошибку - person ; 12.06.2009

Вы должны всегда закрывать sqlconnection сразу после выполнения sqlcommand

Если это не часть функции, то восстанавливать с помощью new не нужно — достаточно будет просто открыть.

person Vnuk    schedule 12.06.2009
comment
соединение закрывается сразу после того, как фрагмент кода просто не включил его. - person ; 12.06.2009

Вы пытались отключить пул соединений и/или несколько активных наборов результатов? Я забыл параметр строки подключения для этого, но если вы вызываете построитель строки подключения, он должен быть в расширенной сетке свойств. Или на www.connectionstrings.com.

Кроме того, является ли это базой данных «пользовательского экземпляра», например, когда вы добавляете файл .mdf в проект Visual Studio с помощью SQL Express?

person Josh    schedule 12.06.2009