在我的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);
答案 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给出了一个很好的总结,即优雅地捕获和处理异常。之后你有几个选项可以回滚等等。