来自SQL的超时错误

时间:2017-09-19 07:38:28

标签: c# sql-server stored-procedures

我正在使用for循环执行一个过程。循环限制为1000或更高。代码和过程运行良好,但有时我得到一个错误

从服务器接收结果时发生传输级别错误(提供程序:TCP提供程序,错误:0 - 信号量超时期限已过期。)

这是我的数据

public string updateselstatus(int sid, string[] trnasId, string[] resparr)
    {
        string ret = "";
        try
        {
            //con.Open();
            for (int j = 0; j < trnasId.Length; j++)
            {
                con.Open();
                string a = trnasId[j].Trim().ToString();
                string b = resparr[j].Trim().ToString();
                SqlCommand cmd = new SqlCommand("OIB_updateselstatus", con);
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@sid", sid);
                cmd.Parameters.AddWithValue("@smsid", trnasId[j].Trim().ToString());
                cmd.Parameters.AddWithValue("@status", resparr[j].Trim().ToString());
                cmd.ExecuteNonQuery();
                con.Close();
            }
            return ret;
        }
        catch (Exception ex)
        {
            con.Close();
            ret = ex.Message.ToString();
            return ret;
        }
        //finally { con.Close(); }
    }

我的程序是

ALTER proc [dbo].[OIB_updateselstatus]
  @status varchar(50),@smsid varchar(100),@sid int
  as
  begin
  update OIB_SmsHistory set IBH_Status=@status where IBH_Smsid=@smsid and IBH_M_idno=@sid
  end  

是我的代码或查询中的任何错误。我怎么能超过这次错误。这取决于我的网速

2 个答案:

答案 0 :(得分:0)

它与你的proc无关,它不是SQL Server错误。

网络库报告此错误,请在此处查看详细信息: The semaphore timeout period has expired

答案 1 :(得分:0)

我不知道它的正确与否。当我改变我的代码时,我可以逃避超时错误

旧代码

public string updateselstatus(int sid, string[] trnasId, string[] resparr)
    {
        string ret = "";
        try
        {
            //con.Open();
            for (int j = 0; j < trnasId.Length; j++)
            {
                con.Open();
                string a = trnasId[j].Trim().ToString();
                string b = resparr[j].Trim().ToString();
                SqlCommand cmd = new SqlCommand("OIB_updateselstatus", con);
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@sid", sid);
                cmd.Parameters.AddWithValue("@smsid", trnasId[j].Trim().ToString());
                cmd.Parameters.AddWithValue("@status", resparr[j].Trim().ToString());
                cmd.ExecuteNonQuery();
                con.Close();
            }
            return ret;
        }
        catch (Exception ex)
        {
            con.Close();
            ret = ex.Message.ToString();
            return ret;
        }
        //finally { con.Close(); }
    }

新代码

   public string updateselstatus(int sid, string[] trnasId, string[] resparr)
    {
        string ret = "";
        try
        {
            for (int j = 0; j < trnasId.Length; j++)
            {
                //string a = trnasId[j].Trim().ToString();
                //string b = resparr[j].Trim().ToString();
                SqlCommand cmd = new SqlCommand("OIB_updateselstatus", con);
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@sid", sid);
                cmd.Parameters.AddWithValue("@smsid", trnasId[j].Trim().ToString());
                cmd.Parameters.AddWithValue("@status", resparr[j].Trim().ToString());
                // New Code 
                adp.SelectCommand = cmd;
                DataTable dt = new DataTable();
                try
                {
                    adp.Fill(dt);

                }
                catch (Exception exp)
                {
                    ret = exp.Message.ToString();
                    return ret;
                }
            }
            return ret;
        }
        catch (Exception ex)
        {
            ret = ex.Message.ToString();
            return ret;
        }
    }

我将cmd.ExecuteNonQuery()更改为adp.Fill(dt)以及与此相关的更改。我不知道是对还是错。但对我来说工作正常