【发布时间】:2013-01-11 21:57:12
【问题描述】:
我知道这已经被问过好几次了,但我想我可能有不同的解决方案;但是,我需要一些帮助才能让它工作。
想法: 业务层调用数据层函数。数据层函数将对数据库上下文的存储过程函数的调用包装在重试策略中。本质上,我希望 LINQ 工具能够导入和管理对存储过程的实际调用,但我希望它会使用一些重试策略来包装逻辑,以解决可重试错误。
这个概念大部分来自What is good C# coding style for catching SQLException and retrying,但是,这似乎只适用于 LINQ to SQL 命令,而不是调用在 DBML 中生成的存储过程函数。
旧方法:
Sub BLFunctionWithoutRetry()
Using DB as CustDataContext
DB.sp_GetCustomers()
End Using
End Sub
带有重试的新逻辑:
Sub BLFunctionWithRetry()
GetCustomers()
End Sub
Function GetCustomers() As List(Of Customer)
Return Retry(Of List(Of Customer))(sp_GetCustomers())
End Function
Function Retry(Of T)(FunctionToCall As Func(Of T)) As T
Dim Attempt As Integer = 0
While True
Try
Using DB as MyDataContext
DB.FunctionToCall()
End Using
Catch ex as SQLException
If Retryable() Then Attempt += 1
If Attempt >= Max Or Not Retryable() Then Throw
End Try
End While
Function Retryable() As Boolean
Return True
End Function
这是总体思路;但是,我需要帮助编写上面的重试函数。我收到了明显的错误FunctionToCall() is not a member of 'MyDataContext'。另外,我不知道怎么写,所以它适用于任何输入参数长度的存储过程。
【问题讨论】:
-
这里有问题吗?
-
Sq,什么不适合你。 Linq-to-SQL 是否会引发不同类型的异常?它会破坏上下文吗?
-
这是否可能与您的存储过程没有返回类型并需要
Action<T>而不是Func<T>或反之亦然的事实有关? -
@jesse 感谢您的编辑。例外是正确的,我不确定您所说的破坏上下文是什么意思。重试功能需要工作,不确定它是否是
Action <T>,这就是我卡住的地方。 -谢谢 -
那么您收到的异常消息到底是什么?
标签: .net vb.net linq linq-to-sql