powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите разобраться с Output параметром в хранимой процедуре вызываемой
2 сообщений из 2, страница 1 из 1
Помогите разобраться с Output параметром в хранимой процедуре вызываемой
    #38116168
Shm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shm
Гость
есть длинная хранимая процедура
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER PROCEDURE [dbo].[PR_FilteredDialogList]
	@DateStart datetime,
	@DateEnd datetime,
	@PageNumber int,
	@PageSize int,
	@KeyWord varchar(256),
	@TotalDialogsFound int OUTPUT --кстати в чём различие деректив  OUTPUT и  OUT они обе работают вроде одинаково, я сначала писал OUT , но теперь пишу OUTPUT от греха
AS
BEGIN
--Что здесь не так важно , она работает и  нормально записывает TotalDialogsFound 
-- вобщем перед тем как отрезать нужную страничку делается что типа такого:
	Select @TotalDialogsFound=COUNT(Linenumber) FROM @Result
END



есть в репозитарии обслуживающим контроллер следующий код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
       public IList<DialogInfoModel> GetAdmDialogsPageList(int pageNumber, int pageSize, DateTime activityDateTimeBegin, DateTime activityDateTimeEnd, string keyWord, out int totalPages)
        {
            IList<DialogInfoModel> result = null;
            totalPages = 0;
            try
            {
                
                var totalDialogsFound = new ObjectParameter("TotalDialogsFound",0);

                var dlgList = Context.PR_FilteredDialogList(activityDateTimeBegin, activityDateTimeEnd, pageNumber, pageSize, keyWord, totalDialogsFound);
                var userRepository = new UserDataRepository(Context);
                
                result = (from prDlgListResult in dlgList
                          let dialogBeginer = userRepository.GetUserBaseById(prDlgListResult.DialogBeginnerId)
                          let interlocutor = userRepository.GetUserBaseById(prDlgListResult.InterlocutorId)
                          let lastSender = interlocutor.UserId == prDlgListResult.LastSenderId ? interlocutor : dialogBeginer
                          let lastMessage = Context.Messages.FirstOrDefault(m => m.MessageId == prDlgListResult.LastMessageId)
                          select new DialogInfoModel(dialogBeginer, interlocutor, prDlgListResult.MessagesCount.HasValue ? prDlgListResult.MessagesCount.Value : 0, new MessageModel(lastMessage, lastSender.UserId), lastSender)
                         ).ToList();

                int itotalDialogsFound = (int)totalDialogsFound.Value; //я  не понимаю с чем связан этот глюк Entity framework, но totalDialogsFound нормальным образом не означивался , до тех пор пока не вызван обход значений полученых в dlgList , т.е. там лежало число записаненое при инициализации  и оператор наданной строке нельзя менять с предыдущем ,перестаёт работать
                totalPages = itotalDialogsFound / pageSize;
                if (totalPages * pageSize < itotalDialogsFound) totalPages++;

            }
            catch(Exception ex)
            {
                Logger.LogError(ex);
            }

            return result;
        }


Собственно вопрос - в коментарии С# кода - он рабочий, и в totalPages - лежит ожидаемое число
а вот код ниже (казалось бы идентичный , не работает), его я написал ранее
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
       public IList<DialogInfoModel> GetAdmDialogsPageList(int pageNumber, int pageSize, DateTime activityDateTimeBegin, DateTime activityDateTimeEnd, string keyWord, out int totalPages)
        {
            IList<DialogInfoModel> result = null;
            totalPages = 0;
            try
            {
                
                var totalDialogsFound = new ObjectParameter("TotalDialogsFound",0);

                var dlgList = Context.PR_FilteredDialogList(activityDateTimeBegin, activityDateTimeEnd, pageNumber, pageSize, keyWord, totalDialogsFound);
                int itotalDialogsFound = (int)totalDialogsFound.Value;//вот так не работает totalDialogsFound - не обновляется, там лежит старое значение.
                totalPages = itotalDialogsFound / pageSize;
                if (totalPages * pageSize < itotalDialogsFound) totalPages++;

                var userRepository = new UserDataRepository(Context);
          
                result = (from prDlgListResult in dlgList
                          let dialogBeginer = userRepository.GetUserBaseById(prDlgListResult.DialogBeginnerId)
                          let interlocutor = userRepository.GetUserBaseById(prDlgListResult.InterlocutorId)
                          let lastSender = interlocutor.UserId == prDlgListResult.LastSenderId ? interlocutor : dialogBeginer
                          let lastMessage = Context.Messages.FirstOrDefault(m => m.MessageId == prDlgListResult.LastMessageId)
                          select new DialogInfoModel(dialogBeginer, interlocutor, prDlgListResult.MessagesCount.HasValue ? prDlgListResult.MessagesCount.Value : 0, new MessageModel(lastMessage, lastSender.UserId), lastSender)
                         ).ToList();


            }
            catch(Exception ex)
            {
                Logger.LogError(ex);
            }

            return result;
        }


Часов 5 бился головой об стену, не понимая почему код ниже не работает, перепробывал всё, даже help читал, нашёл где то текст что output параметры означиваются после обхода результирующего значения если процедура возвращает IList<Type T> , не уверен что я понял текст правльно, но это помогло...
Объясните, пожалуйста, почему, шибко интересно :) .
...
Рейтинг: 0 / 0
Помогите разобраться с Output параметром в хранимой процедуре вызываемой
    #38116172
Shm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shm
Гость
Навело меня на это следующая фраза:
The ObjectParameter objects do make some sense for stored procedures that return both a resultset and some OUTPUT parameters, because in that case the OUTPUT parameters are only available after the resultset has been consumed ....
Найдено это было гуглением , а даже не в хелпе. Вот откуда это следует мне тоже не понятно.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите разобраться с Output параметром в хранимой процедуре вызываемой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]