• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 468
  • Last Modified:

Run vb function whose name is stored in a database

I have a data table with Function names.
These functions are defined in my code and work properly.
Most of these functions return a value I require.
I can retrieve the function name from the database but I don't know to invoke the function in vb.net

Should I be retrieving the function name from the database into a string field ?
How would I run/execute the function with parameters
Can you provide a small example
0
swendell
Asked:
swendell
1 Solution
 
Kevin CrossChief Technology OfficerCommented:
If your table contains data like this:

FunctionName, Param1, Param2, Param3

What you could do is retrieve the values from database as strings or if parameters are numbers as integers.  Then use a case logic or if statement to determine which function to call.

If dr("FunctionName") = "MyFunction1" Then
    MyFunction1(dr("Param1"), dr("Param2"), dr("Param3"))
End If

Where dr is your SqlDataReader for example, but however you retrieve data is inconsequential to my point so hopefully it is clear.
0
 
swendellAuthor Commented:
I can retrieve function name into a string but then I want to run that function.
BUT keep in mind I have many functions and I am not hard-coding every possible function name/value as you did in the example above. In concept looking for something more like this:

Dim myFunction = FunctionNameFromDatabase as string
Execute myFunction & "(" & parameter1 & ")"

0
 
madivad2Commented:
You are after the "CallByName" Function... refer these links:

http://msdn.microsoft.com/en-us/library/22x2chfx.aspx    and
http://msdn.microsoft.com/en-us/library/chsc1tx6.aspx
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
madivad2Commented:
Note: Your function or sub MUST be public!

Some sample code for good measure:
Private Sub button_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CallByName(Me, "MyBeep", CallType.Method)
End Sub
 
Public Sub MyBeep()
    Beep()
End Sub

Open in new window

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
CallByName() will work fine...but if you want the ".Net approved" method then you'll want to use Reflection.  The method/function doesn't have to Public with this approach:

Imports System.Reflection
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strIn As String = "Idle_Mind"
        Dim retValue As Integer = 0
        Dim functionName As String = "Foo"

        Dim mi As MethodInfo = Me.GetType.GetMethod(functionName, BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
        retValue = mi.Invoke(Me, New Object() {strIn})
        MessageBox.Show("retValue = " & retValue, "Return value of Foo()", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

    Private Function Foo(ByVal param As String) As Integer
        MessageBox.Show("param = " & param, "Inside Foo()", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Return IIf(param.ToLower = "idle_mind", 1, 0)
    End Function

End Class


Some more examples:
http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22055463.html#17911012
0
 
swendellAuthor Commented:
madivad2: That was it. I only needed to add a comma and insert the parameter like this:
CallByName(Me, "MyBeep", CallType.Method, parameter)
I forgot the Me since the function is in the same area
0
 
swendellAuthor Commented:
Thank you
0

Featured Post

2018 Annual Membership Survey

Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)

Tackle projects and never again get stuck behind a technical roadblock.
Join Now