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

本文关键字:SubmitChanges 方法 处理 异常 何使用 LINQ | 更新日期: 2023-09-27 18:11:44

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

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之后,当我输入数据库中已经存在的记录时,我仍然会得到一个错误屏幕。如何解决这个问题?什么好主意吗?举个例子就好了

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

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

编辑

既然问题已经改变了,如果catch没有捕捉到在Linq.SubmitChanges()内部抛出的异常,那么抛出的异常可能不是ChangeConflictException类型的。

当我输入一个已经存在于数据库中的记录时,我仍然得到一个错误屏幕

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

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

试试下面提到的代码,它可能会对你有所帮助。

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