Функция C# MVC, которая вызывает хранимую процедуру, но всегда возвращает пустое значение ⇐ C#
-
Anonymous
Функция C# MVC, которая вызывает хранимую процедуру, но всегда возвращает пустое значение
Сейчас я работаю над функцией, которая вызывает хранимую процедуру, которая по какой-то причине всегда возвращает мне пустое значение. Эта хранимая процедура работает, когда я запускаю ее вручную внутри SMSS, но по какой-то причине не работает, когда я использую ее внутри своего приложения. Именно так я всегда вызывал хранимые процедуры внутри своих приложений ASP.NET MVC, и у меня никогда не возникало проблем, но теперь по какой-то причине это не работает.
Вот как я вызываю хранимую процедуру внутри своего приложения
статический объект ArrayToString (массив List) { если (массив == ноль || array.Count == 0) { вернуть DBNull.Value; } // Заключаем каждое значение в одинарные кавычки и соединяем запятыми строковый результат = string.Join(",", array.Select(value => $"'{value}'")); вернуть (объект) результат; } общедоступный список GetMonthlySales (фильтр FilterModel) { вар пол = ArrayToString(filter.gender); вар регион = ArrayToString(filter.region); Категория вар = ArrayToString(filter.category); var резидентность = ArrayToString(filter.residency); вар округ = ArrayToString(filter.county); Параметр SqlParameter[] = новый SqlParameter[] { новый SqlParameter("@queryStartDate", filter.fromDate), новый SqlParameter("@queryEndDate", filter.toDate), новый SqlParameter("@procedure", "GetSalesByMonth"), новый SqlParameter("@ageStart", filter.ageStart), новый SqlParameter("@ageEnd", filter.ageEnd), новый SqlParameter("@gender",ArrayToString(filter.gender)), новый SqlParameter("@region", ArrayToString(filter.region)), новый SqlParameter("@category",ArrayToString(filter.category)), новый SqlParameter("@residency", ArrayToString(filter.residency)), новый SqlParameter("@county",ArrayToString(filter.county)) }; var salesData = _brandt.Database.SqlQuery("LD.GetLicenseData_ListType @queryStartDate, @queryEndDate, @ageStart, @ageEnd, @gender, @county, @region, @procedure, @category, @residency", param). К списку(); вернуть данные о продажах; } Вот модель фильтра, которую я передаю
публичный класс FilterModel { общественный DateTime fromDate {получить; набор; } общественный DateTime toDate {получить; набор; } общедоступный список регион {get; набор; } общественная строка showInactive {get; набор; } общественная строка LicenseType {получить; набор; } общедоступный список резидентности {get; набор; } общественный список пол {получить; набор; } общественный список Категория {получить; набор; } общественный ИНТ ageStart {получить; набор; } общественный ИНТ ageEnd {получить; набор; } общественный список округа {get; набор; } общедоступная модель фильтра() { int год = ДатаВремя.Сейчас.Год; fromDate = новый DateTime (год, 1, 1); toDate = ДатаВремя.Сегодня.Дата; пол = ноль; категория = ноль; возрастНачало = 0; возрастКонец = 100; резиденция = ноль; Тип Лицензии = ноль; округ = ноль; регион = ноль; } } И наконец, вот моя хранимая процедура:
ИЗМЕНИТЬ ПРОЦЕДУРУ [LD].[GetLicenseData_ListType] @queryStartDate ДАТА = NULL, @queryEndDate ДАТА = NULL, @ageStart INT = NULL, @ageEnd INT = NULL, @procedure VARCHAR(55) = NULL, @gender nvarchar(max) = NULL, @county nvarchar(max) = NULL, @region nvarchar(max) = NULL, @category nvarchar(max) = NULL, @residency nvarchar(макс) = NULL КАК НАЧИНАТЬ УСТАНОВИТЬ NOCOUNT ON; DECLARE @Params NVARCHAR(MAX) = N'@queryStartDate DATE, @queryEndDate DATE, @ageStart INT, @ageEnd INT, @gender nvarchar(max), @region nvarchar(max), @procedure VARCHAR(55), @county nvarchar (макс), @category nvarchar(макс), @residency nvarchar(макс)'; ОБЪЯВИТЬ @SqlStr NVARCHAR(MAX); ОБЪЯВИТЬ @WhereCondition NVARCHAR(MAX); ОБЪЯВИТЬ @SelectStatement NVARCHAR(MAX); ОБЪЯВИТЬ @JoinStatement NVARCHAR(MAX); ОБЪЯВИТЬ @GroupByStatement NVARCHAR(MAX); ОБЪЯВИТЬ @OrderByStatement NVARCHAR(MAX); SET @GroupByStatement = ''; -- Заявление о присоединении SET @JoinStatement = ' FROM [BRANDT_DBView].[LD].[VW_LicenseOrderInfo] AS ltoi '; -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'VoidLicenseCount') НАЧИНАТЬ SET @SelectStatement = ' ВЫБРАТЬ регион, COUNT(СЛУЧАЙ, КОГДА isVoided = 1, ТОГДА 1 КОНЕЦ) AS voided_count, COUNT(СЛУЧАЙ, КОГДА isVoided = 0, ТОГДА 1 КОНЕЦ) КАК not_voided_count, ltoi.licenseTypeID'; SET @GroupByStatement = ' ГРУППИРОВАТЬ ПО региону, ltoi.licenseTypeID'; SET @OrderByStatement = 'ORDER BY Region, ltoi.licenseTypeID '; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetSalesByMonth') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS сумма, DATENAME(MONTH, ltoi.orderDate) AS [месяц] '; SET @GroupByStatement = 'GROUP BY DATENAME(Month, ltoi.orderDate) '; SET @OrderByStatement = ' ORDER BY DATENAME(MONTH, ltoi.orderDate)'; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetSalesByYear') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS сумма, ГОД(ltoi.orderDate) AS [Год] '; SET @GroupByStatement = ' ГРУППИРОВАТЬ ПО ГОДУ (ltoi.orderDate) '; SET @OrderByStatement = ' ORDER BY YEAR(ltoi.orderDate);'; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetCategoryData') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS [продажи], lti.LicenseCategory AS категория '; SET @GroupByStatement = 'GROUP BY lti.LicenseCategory '; SET @OrderByStatement = ' '; КОНЕЦ ЕСЛИ (@procedure = 'GetCategoryData' И @category IS NULL) НАЧИНАТЬ SET @JoinStatement += N' LEFT JOIN LD.VW_LicenseTypeInfo AS lti ON ltoi.licenseTypeId = lti.LicenseTypeID '; КОНЕЦ SET @WhereCondition = ' WHERE ltoi.orderDate >= @queryStartDate AND ltoi.orderDate
Сейчас я работаю над функцией, которая вызывает хранимую процедуру, которая по какой-то причине всегда возвращает мне пустое значение. Эта хранимая процедура работает, когда я запускаю ее вручную внутри SMSS, но по какой-то причине не работает, когда я использую ее внутри своего приложения. Именно так я всегда вызывал хранимые процедуры внутри своих приложений ASP.NET MVC, и у меня никогда не возникало проблем, но теперь по какой-то причине это не работает.
Вот как я вызываю хранимую процедуру внутри своего приложения
статический объект ArrayToString (массив List) { если (массив == ноль || array.Count == 0) { вернуть DBNull.Value; } // Заключаем каждое значение в одинарные кавычки и соединяем запятыми строковый результат = string.Join(",", array.Select(value => $"'{value}'")); вернуть (объект) результат; } общедоступный список GetMonthlySales (фильтр FilterModel) { вар пол = ArrayToString(filter.gender); вар регион = ArrayToString(filter.region); Категория вар = ArrayToString(filter.category); var резидентность = ArrayToString(filter.residency); вар округ = ArrayToString(filter.county); Параметр SqlParameter[] = новый SqlParameter[] { новый SqlParameter("@queryStartDate", filter.fromDate), новый SqlParameter("@queryEndDate", filter.toDate), новый SqlParameter("@procedure", "GetSalesByMonth"), новый SqlParameter("@ageStart", filter.ageStart), новый SqlParameter("@ageEnd", filter.ageEnd), новый SqlParameter("@gender",ArrayToString(filter.gender)), новый SqlParameter("@region", ArrayToString(filter.region)), новый SqlParameter("@category",ArrayToString(filter.category)), новый SqlParameter("@residency", ArrayToString(filter.residency)), новый SqlParameter("@county",ArrayToString(filter.county)) }; var salesData = _brandt.Database.SqlQuery("LD.GetLicenseData_ListType @queryStartDate, @queryEndDate, @ageStart, @ageEnd, @gender, @county, @region, @procedure, @category, @residency", param). К списку(); вернуть данные о продажах; } Вот модель фильтра, которую я передаю
публичный класс FilterModel { общественный DateTime fromDate {получить; набор; } общественный DateTime toDate {получить; набор; } общедоступный список регион {get; набор; } общественная строка showInactive {get; набор; } общественная строка LicenseType {получить; набор; } общедоступный список резидентности {get; набор; } общественный список пол {получить; набор; } общественный список Категория {получить; набор; } общественный ИНТ ageStart {получить; набор; } общественный ИНТ ageEnd {получить; набор; } общественный список округа {get; набор; } общедоступная модель фильтра() { int год = ДатаВремя.Сейчас.Год; fromDate = новый DateTime (год, 1, 1); toDate = ДатаВремя.Сегодня.Дата; пол = ноль; категория = ноль; возрастНачало = 0; возрастКонец = 100; резиденция = ноль; Тип Лицензии = ноль; округ = ноль; регион = ноль; } } И наконец, вот моя хранимая процедура:
ИЗМЕНИТЬ ПРОЦЕДУРУ [LD].[GetLicenseData_ListType] @queryStartDate ДАТА = NULL, @queryEndDate ДАТА = NULL, @ageStart INT = NULL, @ageEnd INT = NULL, @procedure VARCHAR(55) = NULL, @gender nvarchar(max) = NULL, @county nvarchar(max) = NULL, @region nvarchar(max) = NULL, @category nvarchar(max) = NULL, @residency nvarchar(макс) = NULL КАК НАЧИНАТЬ УСТАНОВИТЬ NOCOUNT ON; DECLARE @Params NVARCHAR(MAX) = N'@queryStartDate DATE, @queryEndDate DATE, @ageStart INT, @ageEnd INT, @gender nvarchar(max), @region nvarchar(max), @procedure VARCHAR(55), @county nvarchar (макс), @category nvarchar(макс), @residency nvarchar(макс)'; ОБЪЯВИТЬ @SqlStr NVARCHAR(MAX); ОБЪЯВИТЬ @WhereCondition NVARCHAR(MAX); ОБЪЯВИТЬ @SelectStatement NVARCHAR(MAX); ОБЪЯВИТЬ @JoinStatement NVARCHAR(MAX); ОБЪЯВИТЬ @GroupByStatement NVARCHAR(MAX); ОБЪЯВИТЬ @OrderByStatement NVARCHAR(MAX); SET @GroupByStatement = ''; -- Заявление о присоединении SET @JoinStatement = ' FROM [BRANDT_DBView].[LD].[VW_LicenseOrderInfo] AS ltoi '; -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'VoidLicenseCount') НАЧИНАТЬ SET @SelectStatement = ' ВЫБРАТЬ регион, COUNT(СЛУЧАЙ, КОГДА isVoided = 1, ТОГДА 1 КОНЕЦ) AS voided_count, COUNT(СЛУЧАЙ, КОГДА isVoided = 0, ТОГДА 1 КОНЕЦ) КАК not_voided_count, ltoi.licenseTypeID'; SET @GroupByStatement = ' ГРУППИРОВАТЬ ПО региону, ltoi.licenseTypeID'; SET @OrderByStatement = 'ORDER BY Region, ltoi.licenseTypeID '; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetSalesByMonth') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS сумма, DATENAME(MONTH, ltoi.orderDate) AS [месяц] '; SET @GroupByStatement = 'GROUP BY DATENAME(Month, ltoi.orderDate) '; SET @OrderByStatement = ' ORDER BY DATENAME(MONTH, ltoi.orderDate)'; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetSalesByYear') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS сумма, ГОД(ltoi.orderDate) AS [Год] '; SET @GroupByStatement = ' ГРУППИРОВАТЬ ПО ГОДУ (ltoi.orderDate) '; SET @OrderByStatement = ' ORDER BY YEAR(ltoi.orderDate);'; КОНЕЦ -- Исправлено с 5 декабря. ЕСЛИ (@procedure = 'GetCategoryData') НАЧИНАТЬ SET @SelectStatement = ' SELECT COUNT(ltoi.orderID) AS [продажи], lti.LicenseCategory AS категория '; SET @GroupByStatement = 'GROUP BY lti.LicenseCategory '; SET @OrderByStatement = ' '; КОНЕЦ ЕСЛИ (@procedure = 'GetCategoryData' И @category IS NULL) НАЧИНАТЬ SET @JoinStatement += N' LEFT JOIN LD.VW_LicenseTypeInfo AS lti ON ltoi.licenseTypeId = lti.LicenseTypeID '; КОНЕЦ SET @WhereCondition = ' WHERE ltoi.orderDate >= @queryStartDate AND ltoi.orderDate
Мобильная версия