过去几天我一直在寻找一个干净的解决方案,但我开始认为这不是设计完成的,所以我问你的意见如下。
我会尝试简短:我在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>
答案 0 :(得分:1)
如果在方法中调用存储过程,请使用try / catch块。
在它抛出一些异常时,它将跳转到catch并且你将能够处理异常,我不知道,可能抛出错误消息,将错误记录在数据库或其他东西;)
答案 1 :(得分:0)
你能展示存储过程吗?您可以在LINQ to SQL代码中执行插入/更新逻辑,只需在那里调用SubmitChanges(),而不是将其交给存储过程。这将提供有关插入/更新的验证和成功的即时反馈,然后可以将其传递回UI。我发现这是一个更好的插入/更新方法,除非我有很多真正需要存储过程的DB逻辑。您需要确保输入参数化以防止SQL注入。