Любой знает, почему следующее не работает:Хранимая процедура не работает с .asmx файл
[WebMethod()]
public double GetDayCount(string strMeetingDate, string strMeetingTime)
{
string[] strStartDateParts = strMeetingDate.Split('-');
// change DMY to YMD
strMeetingDate = strStartDateParts[2] + '-' + strStartDateParts[1] + '-' + strStartDateParts[0];
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand("BusinessHours", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@meeting_day", SqlDbType.DateTime).Value = strMeetingDate;
command.Parameters.Add("@meeting_time", SqlDbType.DateTime).Value = strMeetingTime;
connection.Open();
using (reader = command.ExecuteReader())
{
reader.Read();
return (double)reader["hours"];
}
}
}
}
Нет сообщений об ошибках возвращается, а возвращаемое значение неверно.
Здесь представлена полная хранимая процедура.
USE [INTRANET]
GO
/****** Object: StoredProcedure [dbo].[BusinessHours] Script Date: 06/24/2013 11:38:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[BusinessHours]
@meeting_day DATETIME,
@meeting_time DATETIME
AS
DECLARE @submit_day DATETIME;
DECLARE @submit_time DATETIME;
DECLARE @start_time_of_business_day DATETIME;
DECLARE @business_day_hours FLOAT;
DECLARE @num1 FLOAT
DECLARE @num2 FLOAT
DECLARE @num3 FLOAT
SET @submit_day = CONVERT(VARCHAR(10),GETDATE(),101);
SET @submit_time = CONVERT(VARCHAR(8),GETDATE(),108);
SET @start_time_of_business_day = '09:00';
SET @business_day_hours = 8.5;
SET @num1 = ((DATEDIFF(dd, @submit_day, @meeting_day))
-(DATEDIFF(wk, @submit_day, @meeting_day) * 2)
-(CASE WHEN DATEPART(dw, @submit_day) = 1 THEN 1 ELSE 0 END)
-(CASE WHEN DATEPART(dw, @meeting_day) = 7 THEN 1 ELSE 0 END)
-(SELECT COUNT(*) FROM bank_holiday WHERE the_date BETWEEN @submit_day AND @meeting_day)) * @business_day_hours
SET @num2 = (select datediff(minute, @start_time_of_business_day, @submit_time))/60.0
SET @num3 = (select datediff(minute, @start_time_of_business_day, @meeting_time))/60.0
select @num1 - @num2 + @num3 as [hours]
Если я запустить хранимую процедуру вручную (как при выполнении его изнутри SQL Studio для управления сервером, нажав на сохраненное имя процедуры и выбор выполнения), я получаю 0,666667 (значение будет отличаться в зависимости от текущей даты/время и дата/время, введенные в хранимую процедуру). Но когда я запускаю файл .asmx, я получаю 994728.666667.
Кто-нибудь знает, почему это происходит? В принципе, часть .666667 верна в обоих примерах, но почему-то файл .asmx добавляет 994728 к правильному значению.
Что вы имеете в виду «запустить хранимую процедуру вручную»? Вы имеете в виду, что вы выполняете его в sql-студии? –
Я считаю, что вы должны передать хранимую процедуру объект 'DateTime' вместо strMeetingDate (который имеет тип' string'). То же самое для strMeetingTime. –
@RosdiKasim, вручную, как и при выборе хранимой процедуры из студии управления сервером sql и нажмите «выполнить». – oshirowanen