如何调用一个名称存储在sql表中的函数(VB.net)

时间:2014-07-20 14:38:15

标签: sql vb.net

也许有人可以帮我解决这个问题。

我编写了一个后台任务,可以从数据库中获取几个工作人员。 在数据库中,我向每个worker添加了应调用的函数的名称。

但我不知道如何从vb.net调用该函数。

如果你们中的某个人可以给我一个提示,那就太棒了。)

感谢 干杯 亚瑟

2 个答案:

答案 0 :(得分:1)

命名空间System.Reflection有许多启用此功能的方法,例如this one:

来自MSDN,上面链接中的示例:

Imports System
Imports System.Reflection

Public Class MagicClass
    Private magicBaseValue As Integer 

    Public Sub New()
        magicBaseValue = 9
    End Sub 

    Public Function ItsMagic(preMagic As Integer) As Integer 
        Return preMagic * magicBaseValue
    End Function 
End Class 

Public Class TestMethodInfo
   Public Shared Sub Main()
      ' Get the constructor and create an instance of MagicClass 

      Dim magicType As Type = Type.GetType("MagicClass")
      Dim magicConstructor As ConstructorInfo = magicType.GetConstructor(Type.EmptyTypes)
      Dim magicClassObject As Object = magicConstructor.Invoke(New Object(){})

      ' Get the ItsMagic method and invoke with a parameter value of 100 

      Dim magicMethod As MethodInfo = magicType.GetMethod("ItsMagic")
      Dim magicValue As Object = magicMethod.Invoke(magicClassObject, New Object(){100})

      Console.WriteLine("MethodInfo.Invoke() Example" + vbNewLine)
      Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue)
   End Sub 
End Class 

'示例程序提供以下输出:

' 
' MethodInfo.Invoke() Example 
' 
' MagicClass.ItsMagic() returned: 900

答案 1 :(得分:1)

我建议您在应用程序代码中使用代理词典。将密钥存储在数据库中,而不是函数名称中。从数据库中检索密钥时,请在字典中查找它,如果存在,则执行它。您不希望允许根据存储在数据库中的名称执行任意方法。

它们的键可以是字符串或整数。我更喜欢后者只是为了节省空间和简化查找,但是字符串可能更容易调试。所以你有一个这样的字典:

Private m_WorkerDelegates As New Dictionary(Of String, Action)()

在其他地方,您可以填写可用的工人:

m_WorkerDelegates.Add("worker1", AddressOf WorkerMethod1)
m_WorkerDelegates.Add("worker2", AddressOf WorkerMethod2)

然后,从数据库中检索时,您需要在字典中查找该方法:

Public Sub ExecuteWorker(ByVal row As DataRow)
    Dim key As String = CStr(row("worker_key"))

    If Not m_WorkerDelegates.ContainsKey(key) Then
        ' either throw exception or report the error in some more effective way '
        Throw New Exception("Invalid worker key specified")
    End If

    ' actually call the worker method '
    m_WorkerDelegates(key)()
End Sub