使用SqlCommand更新时出错

时间:2014-02-10 21:00:24

标签: c# sql-server-2000 sqldatareader sqlcommand sql-server-7

执行代码时出错,我正在使用C#& SQL Server 7/2000。

我正在做的步骤是:

  • 获取所有门票
  • 然后我读了每张票
  • 传递给Web服务方法进行验证
  • 如果返回为true,我需要更新表格。

请查看我的代码,欣赏有关如何修复它的反馈...因为它让我疯狂了几天!谢谢!

    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异常,   Boolean breakConnection)at   System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()at   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,   SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj)at   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,   RunBehavior runBehavior,String resetOptionsString)at   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean   async)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法,DbAsyncResult结果)at   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult   result,String methodName,Boolean sendToPipe)at   System.Data.SqlClient.SqlCommand.ExecuteNonQuery()at   GDR.UpdateTicket.Execute()

2 个答案:

答案 0 :(得分:1)

很难说出导致超时的原因,很可能是你造成了死锁。但是,我认为你应该首先改变这一点:

请勿使用第二个连接,先读取所有数据,关闭阅读器,然后使用相同或其他连接进行处理。如果数据太多 - 请在页面中进行。

我的意思是这样的

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 ...)声明为您做到了这一点。

答案 1 :(得分:0)

我同意Anri的观点,这很可能是由于锁定问题。您是否尝试在WITH (NOLOCK)语句中使用SELECT来查看是否可以解决问题?这应该允许您在迭代结果时更新表,而SELECT语句不会持有读锁定,从而阻止UPDATE执行。