1

在我的 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

4 回答 4

3

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

我对您的建议是,删除函数导入的返回类型并将其设置为无。使用上下文的ExecuteFunction方法执行您的方法。

Context.ExecuteFunction(FunctionName,Parameters)。它肯定会抛出异常。

于 2012-11-03T20:34:56.943 回答
1

首先,确保您在存储过程中抛出异常,我们可以在 C# 代码中捕获该异常。请参阅 - http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/efea444e-6fca-4e29-b100-6f0c5ff64e59 - 报价:

如果希望 RAISERROR 抛出 SqlException,则需要将其严重性设置为 10 以上。严重性为 10 及以下的错误是信息性的,因此不要抛出异常。

我还将向您展示以下代码。当我使用实体框架从我的服务层获取数据时,我一直在我的 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;
}

如果第一个捕获未触发以查看“e”的异常类型/内部异常并从那里开始,您可以在最后一个捕获上放置一个断点。在通用异常上放置断点很有用,因为它让我知道什么时候我还没有处理某些事情。

于 2012-11-03T04:41:50.133 回答
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;
                        } `
于 2017-11-17T05:27:03.810 回答
-1

这里的问题很好地总结了优雅地捕获和处理异常。之后你有几个选项可以回滚等。

于 2012-11-02T13:48:42.983 回答