Ошибка обновления с использованием SqlCommand

Ошибка выполнения кода, я использую C# и SQL Server 7 / 2000.

Шаги, которые я делаю:

  • получить все билеты
  • тогда я читаю каждый билет
  • перейти к методу веб-сервиса для проверки
  • если возвращение истинно, мне нужно обновить таблицу.

Пожалуйста, просмотрите мой код, цените отзывы о том, как это исправить.. как это сводило меня с ума в течение нескольких дней! Спасибо!

    public void Execute()
    {
        SqlConnection conn = null;
        SqlConnection conn2 = null; 
        SqlDataReader rdr = null;

        try
        {
            Helper helper = new Helper();
            using (conn = new SqlConnection(helper.MISDBConnectionString))
            {
                conn.Open();

                string ticketid = null;
                bool bTerm = false;
                int rowsAffected = 0;

                if (rdr != null) { rdr.Close(); }
                SqlCommand selectCommand = new SqlCommand();
                selectCommand.CommandText = "SELECT ...";
                selectCommand.Connection = conn;
                rdr = selectCommand.ExecuteReader();

                while (rdr.Read())
                {
                    ticketid = rdr["ticketid"].ToString();
                    bTerm = calling webserver for validation

                    if (bTerm)
                    {                           
                        using (conn2 = new SqlConnection(helper.MISDBConnectionString))
                        {
                            conn2.Open();
                            SqlCommand updateCommand = new SqlCommand();

                            updateCommand.CommandText = "UPDATE ticket  SET code = @code WHERE ticketid = @ticketid";
                            updateCommand.CommandType = CommandType.Text;
                            updateCommand.CommandTimeout = 120;
                            updateCommand.Parameters.AddWithValue("@code", 8);
                            updateCommand.Parameters.AddWithValue("@ticketid", ticketid);
                            updateCommand.Connection = conn2;

                            rowsAffected = updateCommand.ExecuteNonQuery(); //fails here
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            logger.Error(ex.ToString());
        }
        finally
        {
            if (conn != null) { conn.Close(); }
            if (conn2 != null) { conn2.Close(); }
            if (rdr != null) { rdr.Close(); }
        }
    }

Мне нужно использовать два соединения, потому что это дает мне ошибку, если я использую то, что dataReader должен быть закрыт перед обновлением

Ошибка, которую я сейчас получаю:

System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает. в System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError(исключение SqlException, логическое breakConnection) в System.Data.SqlCarser.Darning. Tr..SqlClient. TdsParser.Run(runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) при System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader DS, runBehavior runBehavior, String resetOptionsString) на System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior, cmdBehavior, RunBehavior, runBehavior, логическое returnStream, логический асинхронный) в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior, cmd класса возвращаемых объектов InternalExecuteNonQuery(результат DbAsyncResult, String methodName, логический sendT oPipe) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery() в GDR.UpdateTicket.Execute()

2 ответа

Решение

Трудно сказать, что является причиной вашего тайм-аута, скорее всего, вы создаете тупик. Но вот что я думаю, вы должны изменить в первую очередь:

Не используйте второе соединение, сначала прочитайте все ваши данные, закройте устройство чтения и затем обработайте его, используя то же или другое соединение. Если данных слишком много - делайте это на страницах.

Я имею в виду что-то вроде этого

List<string> ids = new List<string>

while (rdr.Read())
{
  ids.add(rdr["ticketid"].ToString())
}

rdr.Close();

foreach(id in ids)
{
 // ...

Кроме того, вам не нужно делать это

if (conn != null) { conn.Close(); }
if (conn2 != null) { conn2.Close(); } 

using(conn=new ...) заявление делает это для вас.

Я согласен с Анри, что это, скорее всего, связано с проблемой блокировки. Вы пытались использовать WITH (NOLOCK) в вашем SELECT заявление, чтобы увидеть, если это решает проблему? Это должно позволить вам обновлять таблицу, просматривая результаты без SELECT оператор, содержащий блокировку чтения, которая предотвращает UPDATE от выполнения.

Другие вопросы по тегам