DBFunktoids - SQL Server Stored Procedure Functoid / Extractor Functoids
DBFunktoids is a collection of three functoids that enable the invocation and manipulation of SQL Server 2000 / 2005 stored procedures and their results. You can find a zip with the project and a compiled assembly at the end of this article.
DBFunktoids were written for BizTalk 2006 and the .NET Framework 2.0. If there is enough interest, I can port the project back to BizTalk 2004 (it should pretty much be code copy with a replacement of a Dictionary Generic with a Hashtable).
DBFunktoids are described below.
Stored Procedure Runner
The Stored Procedure Runner executes SQL Server stored procedures and provides the following capabilities:
Can call parameter-less stored procedures.
Supports procedures with up to 9 parameters (can be easily tweaked in source).
Stored procedure parameters can be constants or supplied from a source field.
Values are retrieved using the Value Extraktor functoid.
SQL Exceptions are trapped and stored for retrieval using the Error Extraktor functoid.
To use the Stored Procedure Runner, supply the appropriate number of arguments. If your stored procedure has no parameters, you only need to supply two arguments; if it has one or more parameters, you must supply at least four arguments:
Arg# |
Argument |
Description |
Example |
1 |
Database connection String |
Connection string for database server |
Persist Security Info=False;Integrated Security=SSPI;Data Source=myserver;Initial Catalog=AdventureWorks |
2 |
Stored procedure name |
Name of the stored procedure to invoke |
uspGetEmployeeManagers |
3 |
Parameter names |
Pipe-delimited (“|”) list of stored procedure parameters |
@EmployeeID|@LastName |
4 |
Parameter 1 value |
First parameter value. You must have at least one parameter value. |
102 |
n |
Parameter n |
Subsequent parameters. These are optional and if not set will be NULL. |
Benny |
If your stored procedure has parameters, the functoid expects you to supply at least one value even though it will automatically supply NULL values for all other parameters. If you want to call a procedure with null parameter values, write a wrapper proc with no parameters and call that instead.
Value Extraktor
The Value Extraktor retrieves a value corresponding to a column name from the first row of records returned by the stored procedure. It takes two arguments:
Arg# |
Argument |
Description |
Example |
1 |
Output from Stored Procedure Runner |
Guid associated with the stored proc call and results |
|
2 |
Column name |
Name of the column from which to retrieve a value; if the column doesn’t exist, an empty string is returned |
LastName |
Note that the current implementation does not capture return values from the stored procedure nor does it handle out parameters. One potential solution is to include these values in the result set; another is to modify the source to handle queries differently. If there are enough complaints, I can change it.
Error Extraktor
The Error Extraktor returns either an error message if there was an error in executing the stored procedure or an empty string if there was not (or the results cannot be found). It takes one argument:
Arg# |
Argument |
Description |
Example |
1 |
Output from Stored Procedure Runner |
Guid associated with the stored proc call and results |
To Install
To install:
Install the DBFunktoids.dll assembly into the Global Assembly Cache: gacutil –if DBFunctoids.dll.
Copy the DBFunktoids.dll into the <biztalk root>\Developer Tools\Mapper Extensions directory.
From Visual Studio 2005, click Tools | Choose Toolbox Items, click the Functoids tab, then click Browse to browse to and select the DBFunctoids.dll. On the functoid screen, scroll until you see the three new funktoids and then click the check box to put them on the Database Functoids toolbox palette.
Enjoy.
[updated 5/26/2006: fixed bug in source]
Comments
- Anonymous
February 16, 2006
Check out the new functoids that Eric created!! DBFunktoids is a collection of three functoids that enable... - Anonymous
January 10, 2007
The comment has been removed - Anonymous
January 10, 2007
For those of you who have to run against something other than SQL Server it’s worth noting that the port to OleDB is very easy, just a simple Search and Replace
- using System.Data.SqlClient to using System.Data.OleDb;
- and then pretty much where ever it says sql you say OleDb
- you then need to pass the provider in the connection string Provider=MSDAORA.1;
Anonymous
March 08, 2007
Hi There We are passing two values to the stored Proc , but iam not getting the result when i use the store procedure runner and the value extraktor functoids.When i use provider Initial Catalog=Homer_Common_Sc;Data Source=Dell11;Provider=SQLOLEDB.1; Function 'ScriptNS0:RunStoredProcedure()' has failed. Exception has been thrown by the target of an invocation. Keyword not supported: 'provider'.Your help is really appreciated Thanks Saravana ramkumarAnonymous
March 08, 2007
Hello Saravana, Omit the provider information. The funktoid will is using SqlClient. Let me know if that doesn't work. Thanks, EricAnonymous
March 09, 2007
The comment has been removedAnonymous
March 13, 2007
Hello Eric It worked very well.Thanks for your Custom functoids.I was missing the parameter values that didnt give results though. Regards Saravana ramkumarAnonymous
March 17, 2007
I'm having trouble using the Stored Procedure functoid. When I attempt to validate the map using them I receive the following error: Exception Caught: Mapper Compiler: Functoid not found: guid ({FC1E7D80-7FA7-4AED-AD24-923DC8363E95}) with functoid id (6070) I confirmed that DBfunktoids.dll is in the GAC as well as C:Program FilesMicrosoft BizTalk Server 2006Developer ToolsMapper Extensions so I'm not sure what the problem is. Any help is greatly appreciated! Thanks, FredAnonymous
April 12, 2007
I get exactly the same error. The functoid and maps compiled and worked fine until yesterday! I have uninstalled the functoid from the Gac, deleted it from the mapper extentions and reset the toolbox. I reinstalled everything from scratch: Assembly GUID: FC1E7D80-7FA7-4AED-AD24-923DC8363E95 GAC GUID: e90ba9d74b97ae9c. But I still get this error: Exception Caught: Mapper Compiler: Functoid not found: guid ({FC1E7D80-7FA7-4AED-AD24-923DC8363E95}) with functoid id (6070) All help is welcome! Thanks, MargareteAnonymous
April 13, 2007
Frauss / Margarete, Can you provide any other information? I cannot replicate this problem -- once registered, the funktoids appear to work just fine. Has anything else changed in your environment? Thanks, EricAnonymous
November 09, 2007
Question: How would you supply a UDL as the connection string? Our company stresses the use of these as it makes migration through various testing servers considerably easier - we don't have to recompile for each server. Thanks. Herve MannAnonymous
November 11, 2009
I have observed that Functiod “Stored Procedure Runner” calls SQL Stored procedure multiple times (as many as we put “Value Extraktor” functoids). For example, If an SP returns a row with 8 columns and we use 8 Value Extraktor functoids (one for each column) to fetch those column values, I can see in SQL Profiler that this SP is being called 8 times. We I reduce this to 7 Extraktor functoids, SP is being called 7 times. Is there a way we can avoid this so that SP will be called only once?