如何处理LINQ to SQL中的异常通过C#中的存储过程插入和更新?

时间:2014-03-02 16:55:21

标签: c# sql linq exception linq-to-sql

过去几天我一直在寻找一个干净的解决方案,但我开始认为这不是设计完成的,所以我问你的意见如下。

我会尝试简短:我在C#中使用 LINQ to SQL 来通过自定义存储过程操作SQL服务器上的表作为插入和更新方法。

由于我还是C#的初学者,我使用O-R Designer为我创建了DataContext类。在我的代码中,我初始化DataContext,检索数据,对其执行必要的操作,并调用submitChanges()方法将其持久保存到数据库。

一切正常,直到更新或插入操作与表约束冲突(例如,我尝试将重复值插入到具有UNIQUE约束的列中),从而导致未处理的异常。

不幸的是,submitChanges()方法没有引发异常,这是我唯一可以轻松控制的方法(即我可以轻松地用try / catch包装它并执行保持在相同范围内的错误处理),它被存储过程调用抛出,该调用放在DataContext类中的一个方法中,我无法访问我想要用来处理异常的资源(例如用户界面)

从我之前的读物中,我认为最流行的方案是通过实现客户端验证来防止异常被抛出,使异常成为一个罕见的关键事件,不应该被恢复。

我想要做的是委托数据验证到SQL服务器,如果数据无效,请在客户端处理异常。 (显示错误)

大多数程序员认为这是一个错误的方法,但我想知道这是否有可能。 我能以更实际的方式处理异常吗?有什么我想念的吗?

编辑:为了更好地澄清问题,以下方法引发了异常

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="Contabilità.Cliente_modifica")]
        public int Cliente_modifica([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> id, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="VarChar(50)")] string nuovoNome)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), id, nuovoNome);
            return ((int)(result.ReturnValue));
        }

我可以在try-catch语句中包装对存储过程的调用,如下所示:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="Contabilità.Cliente_modifica")]
        public int Cliente_modifica([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> id, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="VarChar(50)")] string nuovoNome)
        {
            IExecuteResult result = null;
            try
            {
                result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), id, nuovoNome);
            }
            catch (Exception exc)
            {

            }
            return ((int)(result.ReturnValue));
        }

哪个有效,但又会抛出另一个空指针异常,因为结果的值不会被修改。 除此之外,从这个范围我无法访问图形界面(可以从我调用submitChanges()的块中访问)

如何处理(即使以一种不舒服的方式)该方法中的异常? 有没有办法在其他地方处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

如果在方法中调用存储过程,请使用try / catch块。

在它抛出一些异常时,它将跳转到catch并且你将能够处理异常,我不知道,可能抛出错误消息,将错误记录在数据库或其他东西;)

答案 1 :(得分:0)

你能展示存储过程吗?您可以在LINQ to SQL代码中执行插入/更新逻辑,只需在那里调用SubmitChanges(),而不是将其交给存储过程。这将提供有关插入/更新的验证和成功的即时反馈,然后可以将其传递回UI。我发现这是一个更好的插入/更新方法,除非我有很多真正需要存储过程的DB逻辑。您需要确保输入参数化以防止SQL注入。