处理实体框架中的SQL异常

时间:2012-11-02 04:47:07

标签: entity-framework exception-handling

在我的sql存储过程中,我做了一些插入和更新,在某些情况下会抛出主键或唯一键冲突。

当我尝试从ADO.net执行此过程时,.net应用程序也会抛出该异常并让我知道发生了错误。

但是当我尝试从EF执行此过程时,它只是执行。既不显示任何内容也不更新任何内容。

我该如何处理或通知用户发生了错误?

Ado.Net代码

 SqlConnection sqlConnection = new SqlConnection(@"data source=database01; database=test; user id=test; password=test;");
        SqlCommand cmd = new SqlCommand("[uspUpdateTest]", sqlConnection);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("RunID", RunID);
        cmd.Parameters.AddWithValue("RunCode", RunCode);
        sqlConnection.Open();
        var str = cmd.ExecuteNonQuery();

实体框架代码

 TestEntities context = new TestEntities();
        var str=context.UpdateRun(RunID, RunCode);

4 个答案:

答案 0 :(得分:3)

我非常确定,你必须在函数导入中设置一些返回类型(虚拟)。它在大多数情况下都有意义,因为如果你不这样做,你的方法名称就不会出现在intellisense中,你将无法使用context.MethodName访问它。

我的建议是,删除Function Import的返回类型并将其设置为none。使用 ExecuteFunction 上下文方法执行您的方法。

Context.ExecuteFunction(functionName,而参数)。它肯定会抛出异常。

答案 1 :(得分:1)

首先,确保在存储过程中抛出一个Exception,我们可以在C#代码中捕获它。见 - http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/efea444e-6fca-4e29-b100-6f0c5ff64e59 - 引用:

  

如果您希望RAISERROR抛出SqlException,则需要设置它   严重性高于10.严重性为10及以下的错误   信息性的,因此不会抛出异常。

我还会向您展示以下代码。当我使用Entity Framework从我的服务层获取数据时,我一直在我的MVC控制器中使用它:

try
{

   try
   {
        //Entity Framework/Data operations that could throw the data exception
        //...
   } catch (DataException dex) //see http://msdn.microsoft.com/en-us/library/system.data.dataexception.aspx
   {
      //Specifically handle the DataException
      //...
   }
}
catch (Exception e)
{
   //do something (logging?) for the generic exception
   throw e;
}

如果第一个catch没有触发查看'e'的异常类型/内部异常并从那里开始,你可以在最后一个catch上放置一个断点。在通用异常上设置断点很有用,因为它让我知道什么时候我没有处理过。

答案 2 :(得分:0)

我们可以使用以下方式从实体框架中获取sql引发的错误异常: 比方说,我们有DBContext。那么

var connection= (SqlConnection)db.Database.Connection;
if (connection != null && connection.State == ConnectionState.Closed)
        {
            connection.Open();
        }
        SqlCommand com = new SqlCommand("spname", connection);
        com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("@parameter", parameter));
                        try
                        {
                            com.ExecuteNonQuery();
                        }
                        catch (Exception ex)
                        {
                            throw ex.message;
                        } `

答案 3 :(得分:-1)

question here给出了一个很好的总结,即优雅地捕获和处理异常。之后你有几个选项可以回滚等等。