#c# #sql #sql-server
#c# #sql #sql-сервер
Вопрос:
я создаю запись посещаемости сотрудника и создал хранимую процедуру, которая работает нормально и возвращает ожидаемые результаты, но когда я пытаюсь запустить хранимую процедуру в c #, она генерирует сообщение об исключении, т.Е. Неправильный синтаксис рядом с ключевым словом ‘null’
Результаты панели данных предварительного просмотра набора данных Visual Studio:
CREATE PROCEDURE [dbo].[spMonthlyAttReport]
@fkSerial [NUMERIC] = 0,
@attDateTime [DATETIME],
@Company NVARCHAR(50) = NULL,
@Department NVARCHAR(50) = NULL
AS
BEGIN
DECLARE @StartOfMonth DATETIME
DECLARE @EndOfMonth DATETIME
DECLARE @month INT
DECLARE @year INT
DECLARE @day INT
SET @month = DATEPART(MONTH, @attDateTime)
SET @year = DATEPART(YEAR, @attDateTime)
SET @day = DATEPART(DAY, @attDateTime)
SET @StartOfMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
SET @EndOfMonth =
DATEADD(
SECOND,
-1,
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0)
)
;
WITH DATERANGE AS
(
SELECT
DT = DATEADD(DD, 0, @StartOfMonth)
WHERE DATEADD(DD, 1, @StartOfMonth) <= @EndOfMonth
UNION ALL
SELECT
DATEADD(DD, 1, DT)
FROM DATERANGE
WHERE DATEADD(DD, 1, DT) <= @EndOfMonth
)
SELECT
CONVERT(DATE, DATERANGE.DT, 101) AS DateofAtt,
YEAR(CONVERT(DATE, DATERANGE.DT, 101)) AS [attyear],
MONTH(CONVERT(DATE, DATERANGE.DT, 101)) AS [attMonth],
DAY(CONVERT(DATE, DATERANGE.DT, 101)) AS [attDay],
CONVERT(VARCHAR(3), CONVERT(DATE, DATERANGE.DT, 101), 100) AS [attMonthName],
DATENAME(dw, CONVERT(DATE, DATERANGE.DT, 101)) AS [attDayName],
tblEmployInfo.company,
tblEmployInfo.serial,
attInAt =
(
SELECT
MIN(attDateTime)
FROM tblAttendance
WHERE tblAttendance.attDate = CONVERT(DATE, DATERANGE.DT, 101)
AND tblAttendance.attINOUT = 1
AND tblAttendance.fkSerial = tblEmployInfo.serial
),
attOutAt =
(
SELECT
MAX(attDateTime)
FROM tblAttendance
WHERE tblAttendance.attDate = CONVERT(DATE, DATERANGE.DT, 101)
AND tblAttendance.attINOUT = 0
AND tblAttendance.fkSerial = tblEmployInfo.serial
),
tblEmployInfo.[name],
tblEmployInfo.department
FROM DATERANGE,
tblAttendance,
tblEmployInfo
WHERE ((tblEmployInfo.Serial = @fkSerial OR @fkSerial = 0)
AND (tblEmployInfo.department = @Department OR @Department IS NULL)
AND (tblAttendance.attDate IN (SELECT * FROM DATERANGE))
AND (tblEmployInfo.company = @Company OR @Company IS NULL)
)
GROUP BY CONVERT(DATE, DATERANGE.DT, 101),
tblEmployInfo.company,
tblEmployInfo.serial,
tblEmployInfo.[name],
tblEmployInfo.department
ORDER BY tblEmployInfo.serial,
CONVERT(DATE, DATERANGE.DT, 101)
END
C # Код
attMonthlyReportDataSetTableAdapters.spMonthlyAttReportTableAdapter adp =
new attMonthlyReportDataSetTableAdapters.spMonthlyAttReportTableAdapter();
attMonthlyReportDataSet ds = new attMonthlyReportDataSet();
DateTime date1 = DateTime.Parse("04/12/2019");
adp.Fill(ds.spMonthlyAttReport, 0, date1,"ZCG","ITD");
DataTable dt = new DataTable();
dt = ds.spMonthlyAttReport;
ReportViewer1.LocalReport.DataSources.Clear();
ReportDataSource rds = new ReportDataSource("attMonthlyReportDataSet_spMonthlyAttReport", dt);
ReportViewer1.LocalReport.DataSources.Add(rds);
ReportViewer1.LocalReport.Refresh();
Комментарии:
1. Возможно, ваш код отправляет нулевое значение параметру процедуры
2. Если SP работает нормально изолированно, то я думаю, нам нужно увидеть код C #, который на самом деле вызывает это, поскольку именно в этом, скорее всего, и заключается проблема
3. моя процедура уже обрабатывает нулевые значения
4. @Smart предполагая, что вы вызываете его правильно… чего мы не видим
5. Ошибка исходит из какого-то другого кода или это не фактическая версия этого sp. Тем не менее, я по-прежнему рекомендую вам избавиться от олдскульных соединений с запятой, неясного префикса
sp
и начать использовать псевдонимы таблиц. Также, пожалуйста, решите, имеет ли вашtblAttendance.attDate
date/datetime
тип (как он рассматривается здесьtblAttendance.attDate IN (SELECT * FROM DATERANGE)
) или string (иначе зачем вам приводить его сюдаtblAttendance.attDate = CONVERT(DATE, DATERANGE.DT, 101)
; чтобы сократить время использованияCAST(... AS DATE)
)