Как получить скалярное значение из хранимого процесса, используя Nettiers - PullRequest
2 голосов
/ 07 мая 2010

У меня действительно простая хранимая процедура, которая выглядит следующим образом:

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

Я пытаюсь заставить неттье сгенерировать метод с такой подписью:

public long VisitorService.GetVisitorIDByVisitorGUID(GUID visitorGUID);

По сути, я хочу, чтобы Nettiers вызывал ExecuteScalar вместо ExecuteReader. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

Почему бы не использовать пользовательские функции доступа к данным для вызова хранимого процесса с помощью ExecuteScalar? (http://nettiers.com/DataLayer.ashx#Read_Methods:_4)

var vistorId = (long)DataRepository.Provider.ExecuteScalar(CommandType.StoredProcedure, "_Visitor_GetVisitorIDByVisitorGUID");

Тело хранимой процедуры должно выглядеть следующим образом:

Select VisitorID 
FROM dbo.Visitor 
WHERE VisitorGUID = @VisitorGUID

Return

или

Declare @VisitorId bigint
Set @VisitorId = (
                Select VisitorId
                From dbo.Visitor
                Where VisitorGuid = @VisitorGUID
                )

Select @VisitorId

Return
0 голосов
/ 08 марта 2013

Для тех, кто хочет сделать это программно, приведенный выше пример не будет работать, так как нет способа передать необходимое значение параметра, используя любое из переопределений этого метода.

var vistorId = (long)DataRepository.Provider.ExecuteScalar(CommandType.StoredProcedure, "_Visitor_GetVisitorIDByVisitorGUID");

Единственный способ, которым янайдено, что это достигается путем передачи DbCommand в качестве единственного аргумента методу ExecuteScalar:

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);
}
...