1

次の問題があります。

挿入しようとしましmultiple employee dataたが、従業員データは一度だけ挿入する必要がありますが、複数の従業員を選択し、そのうちの 1 人が以前に挿入された場合、データベースの制約に従ってエラーがスローされます。

私の質問は(ベストプラクティス)です:この例外を処理する方法、その例外のためにループを終了せずに繰り返されていない従業員の挿入を再開したい場合。


protected void ibtn_save_detail_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Fill_Form();
                RewardDetails obj = new RewardDetails();
                var collection = ddl_employees.CheckedItems;
                for (int i = 0; i < collection.Count; i++)
                {
                    obj.Emp_num = int.Parse(collection[i].Value);
                    obj.Req_ser = int.Parse(reqSer);
                    obj.Req_year = int.Parse(reqYear);
                    DataTable dt = Utilities.GetDep(obj.Emp_num);
                    obj.Main_code = int.Parse(dt.Rows[0]["dep_code"].ToString());
                    obj.Year = int.Parse(dt.Rows[0]["dep_year"].ToString());
                    obj.Dep_name = dt.Rows[0]["dep_name"].ToString();

                    string res = obj.InsertReward();//exception in case of repetition .

                    if (!string.IsNullOrEmpty(res))
                    {

                        div_detail_result.Visible = true;
                        SetMessage("");

                    }
                    else
                    {
                        SetMessage("Adding the employee has been done :" + collection[i].Text.Trim());
                    }
                }
                BindDetailsGV(obj.Req_ser, obj.Req_year);
                ddl_employees.ClearCheckedItems();

            }
            catch (Exception ee)
            {
                SetMessage("Error,this employee has been added before.");
                ddl_employees.ClearCheckedItems();
            }
        }
4

4 に答える 4

1

tryループ内に配置する必要があります。

for (int i = 0; i < collection.Count; i++)
{
    try
            {
                obj.Emp_num = int.Parse(collection[i].Value);
                obj.Req_ser = int.Parse(reqSer);
                obj.Req_year = int.Parse(reqYear);
                DataTable dt = Utilities.GetDep(obj.Emp_num);
                obj.Main_code = int.Parse(dt.Rows[0]["dep_code"].ToString());
                obj.Year = int.Parse(dt.Rows[0]["dep_year"].ToString());
                obj.Dep_name = dt.Rows[0]["dep_name"].ToString();

                string res = obj.InsertReward();//exception in case of repetition .

                if (!string.IsNullOrEmpty(res))
                {

                    div_detail_result.Visible = true;
                    SetMessage("");

                }
                else
                {
                    SetMessage("Adding the employee has been done :" + collection[i].Text.Trim());
                }
            }
    catch (Exception ee)
        {
            // your exception code
        }
}
于 2013-10-21T11:15:07.207 に答える
1

try catch が for ループをカプセル化していないことを確認してください。

try
{
   for(...){}
}
catch(Exception){  }

次のようにする必要があります。

for(...)
{
    try{  }
    Catch{  }
}

または、 for ループ内で例外がスローされない場合は、ループを開始する前に単にキャッチするか、ループを開始した後に試行します。

于 2013-10-21T11:17:11.437 に答える
1

行にのみ適用するように try/catch を移動しますobj.InsertReward();Exceptionまた、によってスローされた特定の例外だけをキャッチしないでくださいinsertReward

したがって、コードは次のようになります。

protected void ibtn_save_detail_Click(object sender, ImageClickEventArgs e)
{
    Fill_Form();
    RewardDetails obj = new RewardDetails();
    var collection = ddl_employees.CheckedItems;
    for (int i = 0; i < collection.Count; i++)
    {
        obj.Emp_num = int.Parse(collection[i].Value);
        ...

        string res;
        try
        {
            res = obj.InsertReward();
            // stuff to do if added
        }
        catch (RewardExistsException)
        {
            // stuff to do if already exists
        }
    }
}
于 2013-10-21T11:13:26.917 に答える