Ошибка обновления с использованием 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
от выполнения.