如何使用LINQ的SubmitChanges方法处理异常?

时间:2013-05-01 13:48:17

标签: c# asp.net linq exception

我正在使用LINQ向我的department表添加一条新记录,这就是我所做的:

try
{
    dpt = new departement();
    dpt.departementcode = tbDepartementCode.Value;
    dpt.departementname = tbDepartementName.Value;
    dpt.createby = "hendra";
    dpt.createdate = DateTime.Now;
    dpt.updateby = "hendra";
    dpt.lastupdate = DateTime.Now;

    Linq.departements.InsertOnSubmit(dpt);
    Linq.SubmitChanges(); // error happen here, and could not catch it.

    Response.Redirect("Departement.aspx");
}
catch (ChangeConflictException ex)
{
    Console.WriteLine(ex.Message);
}

问题是,即使在使用trycatch之后,当我输入数据库中已存在的记录时,仍会出现错误屏幕。怎么解决?有任何想法吗?一些例子会很棒。

3 个答案:

答案 0 :(得分:2)

如果您尝试在catch块中再次提交更改,则可能会产生新的异常。你已经在的catch块,捕获新的异常。对于要捕获的新异常,您必须在catch中定义一个新的try-catch。

修改

由于问题已更改,如果catch没有捕获Linq.SubmitChanges()内引发的异常,则抛出的异常可能不是ChangeConflictException类型。

答案 1 :(得分:1)

  

当我输入数据库中已存在的记录时,我仍会收到错误屏幕

因此,如果数据存在,请先检查数据库,是否存在更新旧数据,否则添加新数据。

try
{
    // Check Database first with your primary key, lets assume your check returned a
    // with dptcheck

    var dptcheck = from d in Linq.departments
                   where d.YourPrimaryKey == YourValue
                   select d;

    dpt = new departement();

    if (dptcheck.Any()) dpt = dptcheck.FirstOrDefault();

    dpt.departementcode = tbDepartementCode.Value;
    dpt.departementname = tbDepartementName.Value;
    dpt.createby = "hendra";
    dpt.createdate = DateTime.Now;
    dpt.updateby = "hendra";
    dpt.lastupdate = DateTime.Now;

    if (!dptcheck.Any()) Linq.departements.InsertOnSubmit(dpt); 
    // notice you only insert data if no old value found
    Linq.SubmitChanges();

    Response.Redirect("Departement.aspx");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

答案 2 :(得分:0)

尝试下面提到的代码,它可以帮助你。

 Context.SubmitChanges(Result =>
         {

             if (Result.HasError)
                 {
                 CallBack(Result.Error.ToString());
                 }
             else
                 {
                 CallBack("Done");
                 }
         }, null);