2017-09-19 13 views
0

私はforループを使ってプロシージャを実行しています。ループの限界は、1000倍以上です。コードとプロシージャは正常に動作しますが、何度かエラーが発生しましたSQLからのタイムアウトエラー

サーバーから結果を受け取ったときにトランスポートレベルのエラーが発生しました(プロバイダ: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 [email protected] where [email protected] and [email protected] 
    end 

が彼らのaがあります私のコードやクエリのnyの障害。どうすればこの時間外に来ることができますか?それは私のインターネット速度に依存しますか

+1

なぜdbを開くと、各ループを閉じますか? – BugFinder

+0

@ BugFinderループは5〜10分まで動く。だから私はそれのために接続の損失を考える。悪い決断かもしれません.. – Jks

+0

接続は人生の欠如のためにのみ終了するでしょう、これはあなたに質問が長すぎると伝えています – BugFinder

答えて

0

これはあなたのprocとは関係ありません、それはSQL Serverのエラーではありません。

このエラーは、ネットワークライブラリによって報告され、詳細はこちらをご確認ください: The semaphore timeout period has expired

+0

あなたは私が下に投稿した回答をお待ちください。 – Jks

+0

@Jks、私はcmd.ExecuteNonQuery()/ adp.Fill(dt)についてよくわかりません。SQL Server側はよく分かりますが、C#ではなく、使用するプロトコルまたは接続は同じですか? – sepupic

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; 
     } 
    } 

時間から逃れることができる私は、ADPにcmd.ExecuteNonQueryを()に変更。フィル(dt)とこれに関連する変更。それが正しいかどうかはわかりません。しかし、私のためにうまく動作します

関連する問題