By Philipp Guntermann - 8/25/2008
Hi,I am wondering if someone could provide a sample code as how I can use DataBasics.DataSources[""].ExecuteStoredProcedure(..) My sproc takes 2 varchar input parameters and returns an integer value: @HWID VARCHAR(250),@ComputerName VARCHAR(250),@iKassenId int OUTPUT i want to execute the sproc and get the Result integer. Thanks !
|
By Philipp Guntermann - 8/25/2008
i tried it like that and get a NULLREFERENCE exception:int iResult = 0;System.Data.Common. DbParameter[] spParams = new System.Data.SqlClient.SqlParameter[2];spParams[0].Value = "123123123";spParams[1].Value = "Computer1";iResult = ( int)DataBasics.DataSources[""].ExecuteStoredProcedure("spK_KassenAnmeldung", DbCommandExecutionType.ExecuteScalar, spParams);
|
By Philipp Guntermann - 8/26/2008
heres the complete code:private static int KassenAnmeldung(){ System.Data.Common. DbParameter[] spParams = new System.Data.SqlClient.SqlParameter[2];spParams[0] = new System.Data.SqlClient.SqlParameter();spParams[1] = new System.Data.SqlClient.SqlParameter();spParams[0].ParameterName = "@HWID";spParams[1].ParameterName = "@ComputerName";spParams[0].Value = "123123123";spParams[1].Value = "Computer1";return (int)DataBasics.DataSources[""].ExecuteStoredProcedure("spK_KassenAnmeldung", DbCommandExecutionType.ExecuteScalar, spParams);} the stored procedure itself works. i tested it within sql management studio: DECLARE @i intEXEC @i= spK_KassenAnmeldung '123123123','Computer9';select @i
|
By Philipp Guntermann - 8/26/2008
Shorter Code, but same error:private static int KassenAnmeldung(){ return (int)DataBasics.DataSources[""].ExecuteStoredProcedure("spK_KassenAnmeldung", DbCommandExecutionType.ExecuteScalar, new System.Data.SqlClient.SqlParameter("@HWID", "123123123"),new System.Data.SqlClient.SqlParameter("@ComputerName", "Computer9"));} For some reason the Object returned by executestoredprocedure has a value of NULL. Executing the same sproc on the sql management studio with the same parameters returns a nice integer value. i dont get it ?
|
By Michel Levy - 8/26/2008
Hi Phillip,Does your procedure run fine (and returns a nice integer value) when executed from within a BO? And why not using a BO? I've a lot of SP and Scalar functions on a SQL database, all in dbo schema, and I use any of my BOs (no one connecting on dbo schema) to run theses SP and functions (you need to grant exec in an intermediate SP, or execute as ..., and revert after execution)
|
By Philipp Guntermann - 8/26/2008
HI Michel, thanks for you reply. i dont know i it runs using a bo, and for this particular function i dont really want to use a bo. i dont quite understand what you mean by: (you need to grant exec in an intermediate SP, or execute as ..., and revert after execution)
From the Help-Document, the ExecuteStoredProcedure function is capable of doing what i want. i dont understand why i would need to use a bo for it. ?
|
By Dustin Taylor - 8/26/2008
Your code looks good. What is in your stored procedure? I just made a test that comes accross fine using the StrataFrame sample. Here is my SF code: Dim spParams As System.Data.Common.DbParameter() = {New System.Data.SqlClient.SqlParameter} spParams(0).ParameterName = "@cust_pk" spParams(0).Value = "1" Dim test As String = MicroFour.StrataFrame.Data.DataBasics.DataSources("").ExecuteStoredProcedure("GetCustomerLastName", MicroFour.StrataFrame.Data.DbCommandExecutionType.ExecuteScalar, spParams) And here is the alter for my stored procedure: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetCustomerLastName] -- Add the parameters for the stored procedure here @cust_pk int = 1 AS BEGIN -- Insert statements for procedure here SELECT cust_LastName FROM Customers WHERE cust_pk = @cust_pk END
|
By Philipp Guntermann - 8/26/2008
Hi Dustin,this is my sproc: set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGO ALTER PROCEDURE [dbo].[spK_KassenAnmeldung] @HWID VARCHAR(250),@ComputerName VARCHAR(250)AS DECLARE @iKassenId int SET @iKassenId = ( SELECT TOP 1 ID FROM tbKassen WHEREHWID = @HWID AND ComputerName = @ComputerName );IF ( @iKassenId IS NULL )BEGINDECLARE @iKassenNr int;SET @iKassenNr = ( SELECT count(*) FROM tbKassen );INSERT INTO tbKassen (Bezeichnung, Zyklus, HWID, ComputerName)VALUES ('Kasse'+LTRIM(STR(@iKassenNr)) , 0, @HWID, @ComputerName);SET @iKassenId = SCOPE_IDENTITY();END RETURN @iKassenId
|
By Greg McGuffey - 8/26/2008
I'm wondering if the problem is that you are using Return instead of Select. My understanding is that Return is used to return a status code, while you'd use Select to return a record set, which ExecuteScalar will then retrieve data from. So change:
RETURN @iKassenId
to
Select @iKassenId
and see if that works. I'm guessing that since you don't select anything, either null or DdNull.Value is being returned from execute scalar.
You might also want to check for conditions like this in code. Something like:
object result = DataBasics.DataSources[""].ExecuteStoredProcedure("spK_KassenAnmeldung", DbCommandExecutionType.ExecuteScalar, spParams);
if result != null && result != DbNull.Value
{
return (int)result;
}
else
{
// return default or throw an exception
return 0
}
|
By Philipp Guntermann - 8/26/2008
hi,thanks. that seems like it could be the problem. i wasnt aware of the use of select instead of return. i will try changing it when i get back to work tommorow.
|
By Michel Levy - 8/26/2008
Philipp,Using a BO is for a maintenance purpose (All the business code is in the BO, all the connections against SQL server run from a BO to DL) And the intermediate SP (or execute as.. revert) is for a security purpose: I never expose a SP directly in the AppUser schema.
|
By Dustin Taylor - 8/26/2008
Yep, greg nailed it. Even though it is a scalar, you still want to return a recordset, hence the need for a SELECT. RETURN will exit the code loop immediately. It can return an integer, but that is typically used to show success or failure and isn't what you are looking for in this case.
|
By Philipp Guntermann - 8/26/2008
Just letting you know it does indeed work now using SELECT instead of RETURN.Thanks again to Greg for pointing this out.
|
By Greg McGuffey - 8/27/2008
Glad you got it working and that I was of help!
|
By Alex Luyando - 6/9/2009
Greg McGuffey (08/26/2008) I'm wondering if the problem is that you are using Return instead of Select. My understanding is that Return is used to return a status code, while you'd use Select to return a record set, which ExecuteScalar will then retrieve data from.
How I wish I had read this about two hours earlier! LOL
Very handy to know.. Thanks!
|
By Greg McGuffey - 6/9/2009
LOL! Glad you found a solution to your issue though!
|