¿Cómo consigo un valor escalar de un procedimiento almacenado utilizando Nettiers
-
04-10-2019 - |
Pregunta
Tengo un procedimiento almacenado muy simple que es similar al siguiente:
CREATE PROCEDURE _Visitor_GetVisitorIDByVisitorGUID
(
@VisitorGUID AS UNIQUEIDENTIFIER
)
AS
DECLARE @VisitorID AS bigint
SELECT @VisitorID = VisitorID FROM dbo.Visitor WHERE VisitorGUID = @VisitorGUID
--Here's what I've tried
RETURN @VisitorID 'Returns an IDataReader
SELECT @VisitorID 'Returns an IDataReader
--I've also set it up with a single output
--parameter, but that means I need to pass
--the long in by ref and that's hideous to me
Estoy intentando conseguir nettiers para generar un método con esta firma:
public long VisitorService.GetVisitorIDByVisitorGUID(GUID visitorGUID);
Básicamente quiero Nettiers para llamar ExecuteScalar en lugar de ExecuteReader. ¿Qué estoy haciendo mal?
Solución
¿Por qué no utilizar la funcionalidad de acceso a datos personalizados para llamar a su procedimiento almacenado con ExecuteScalar? ( http://nettiers.com/DataLayer.ashx#Read_Methods:_4 )
var vistorId = (long)DataRepository.Provider.ExecuteScalar(CommandType.StoredProcedure, "_Visitor_GetVisitorIDByVisitorGUID");
El cuerpo del procedimiento almacenado debe ser similar a:
Select VisitorID
FROM dbo.Visitor
WHERE VisitorGUID = @VisitorGUID
Return
o
Declare @VisitorId bigint
Set @VisitorId = (
Select VisitorId
From dbo.Visitor
Where VisitorGuid = @VisitorGUID
)
Select @VisitorId
Return
Otros consejos
For those wanting to do this programatically, the above example will not work as there is no way to pass the necessary parameter value using any of that method's overrides.
var vistorId = (long)DataRepository.Provider.ExecuteScalar(CommandType.StoredProcedure, "_Visitor_GetVisitorIDByVisitorGUID");
The only way I've found to accomplish this is by passing a DbCommand as a lone argument to the ExecuteScalar method:
int myReturnID = 0;
using (SqlCommand cmd = new SqlCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_MyStoredProcedure";
cmd.Parameters.Add(new SqlParameter("MyParameter", myParameter));
myReturnID = (Int32)DataRepository.Provider.ExecuteScalar(cmd);
}