РЕДАКТИРОВАТЬ: я ответил на свой вопрос ниже, но пока не могу его принять.
Я использую С# и SQL2014. Я знаю, что этот вопрос возникает повсюду, и типичным ответом является использование универсального формата, но это не то, что я ищу. У меня есть два сценария. Один работает, а другой нет, и это то, что меня беспокоит. Оба используют одну и ту же хранимую процедуру (хотя и в разных базах данных). Если я редактирую хранимую процедуру, чтобы она была командой, и вручную устанавливаю параметры на то же самое, что и в C#, оба варианта работают. Оба сценария абсолютно одинаковы, за исключением разных баз данных, поэтому вот что я делаю.
cmd = new sqlcommand......
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 60;
cmd.Parameters.AddWithValue("@date", "3/16/2015");
cmd.Parameters.AddWithValue("@startTime", "12:00 AM");
cmd.Parameters.AddWithValue("@endTime", "1:00 AM");
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt); //Error
Что интересно, это происходит только тогда, когда для @date установлено значение «16.03.2015». Я пробовал около 6 других дат, и все работает нормально. При этом эта дата отлично работает в другой базе данных. Кто-нибудь знает, что это может быть? В хранимой процедуре этим параметрам присваивается значение SMALLDATETIME. Если нужно, я могу попробовать поместить сюда часть хранимой процедуры.
Вот часть хранимой процедуры, которая вызывает проблему:
@date SMALLDATETIME,
@startTime SMALLDATETIME,
@endTime SMALLDATETIME
--[DATE] is a smalldatetime column in the database
WHERE
[DATE] = @date --ERROR HAPPENS BECAUSE OF THIS
РЕДАКТИРОВАТЬ: Извините за всю путаницу. После дополнительной отладки похоже, что реальная проблема может исходить из этого оператора в процедуре:
SELECT
DATEDIFF(mi, '00:00:00', [START]) AS [START],
CASE WHEN [END] = '00:00:00' THEN 1440
ELSE DATEDIFF(mi, '00:00:00', [END]) END AS [END]
.
.
.