【发布时间】:2014-06-16 09:40:07
【问题描述】:
我正在开发的一款软件用于将数据从 CSV 文件上传到数据库中。与数据库的交互使用的是 EF6。要提交数据,有一个名为“InsertRow”的存储过程,它接受接口ID(字符串)、数据行(字符串)、分隔符(字符串),并具有输出参数:错误代码(int)和错误消息( 0)。 SP 定义如下所示:
CREATE PROCEDURE [dbo].[InsertRow]
(
@InterfaceID NVARCHAR(MAX) ,
@Row NVARCHAR(MAX) ,
@Delimiter NVARCHAR(MAX) ,
@ErrorCode INT OUTPUT ,
@ErrorMessage NVARCHAR(MAX) OUTPUT
)
它是这样从实体调用的:
public virtual int InsertRow(string interfaceID, string row, string delimiter)
{
var errorCode = new ObjectParameter("ErrorCode", typeof(int));
var errorMessage = new ObjectParameter("ErrorMessage", typeof(string));
var interfaceIDParameter = interfaceID != null ?
new ObjectParameter("InterfaceID", interfaceID) :
new ObjectParameter("InterfaceID", typeof(string));
var rowParameter = row != null ?
new ObjectParameter("Row", row) :
new ObjectParameter("Row", typeof(string));
var delimiterParameter = delimiter != null ?
new ObjectParameter("Delimiter", delimiter) :
new ObjectParameter("Delimiter", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("InsertRow", interfaceIDParameter, rowParameter, delimiterParameter, errorCode, errorMessage);
}
仅当临时表已创建(在调用此表之前完成)时,该过程才有效,因此 EF 上下文需要在提交所有行时保持打开状态。这不是问题,正在管理中。该过程执行一些验证,显然还有一些从字符串到正确数据类型的转换。输出参数 Error Code 和 Error Message 填充了错误信息以供应用程序处理。该过程以执行此操作的 catch 结束:
BEGIN CATCH
SET @ErrorCode = ERROR_NUMBER()
SET @ErrorMessage = ERROR_MESSAGE()
INSERT INTO ErrorLog values (GetDate(),@InterfaceID, @Row, @Deliminator, ERROR_NUMBER(), ERROR_MESSAGE())
END CATCH;
大多数时候,这是可行的。但是,在某些情况下,不会设置错误代码和错误消息,而是会引发 EntityCommandExecutionException 和以下内部异常消息:
“当前事务无法提交,不支持写入日志文件的操作。回滚事务。”
我很难理解为什么抛出的一些错误会在这里捕获并正确处理,而另一些则会失败。例如,当提交字符串“日期文本”作为应输入到日期时间字段的行的一部分时。这应该被捕获和报告,但是我得到了一般的异常。
还值得注意的是,我也从 Catch 块中删除了插入语句。然后异常的消息变为
“在批处理结束时检测到不可提交的事务。事务回滚。”
以前有人见过这个问题吗?我们在这里缺少什么可以帮助我们解决它?什么会导致交易无法提交?我们需要有效地捕获这些消息,以便向用户报告他们文件的问题。
【问题讨论】:
标签: c# sql sql-server entity-framework transactions