|
|
|
Supreme Being
      
участник
Last Login: 28.10.2007 0:53
Сообщ.: 83,
Visits: 593
|
|
Есть ХП: sp_name @status=0,@dat='03.16.2005 04:01:17'
Прекрасно работала в 2000, перешел на 2005Expr - выдает:
"Ошибка при преобразовании типа данных varchar к datetime."
Вызов идет из ASP.NET(2) через cmd.CommandText="sp_name @status=0,@dat='03.16.2005 04:01:17'";dr=cmd.ExecuteReader();
Странно что это только локально не работает, на хостинге все прекрасно пашет ...
Итак: в каком формате надо вносить дату в параметр?
(дд.мм.ггггг или мм.дд.гггг или ггггг.мм.ддд или еще как ...)
Или это зависит сугубо от локали?(latin1_general или cyrillic)
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
|
|
|
|
Supreme Being
      
участник
Last Login: 28.10.2007 0:53
Сообщ.: 83,
Visits: 593
|
|
Я в курсе про параметры, но это усложняет процесс и я привык использовать просто текстовый запрос.
У подобных процедур 20 параметров и использовать параметры будет очень непросто.
Да и вся система написана таким образом что параметры не катят - есть метод sql_exec(string sql), который просто выполняет пришедший запрос.
Притом что сайтик был написан еще под использование MSSQL7 - переписывать все это дело гиморно.
Сначала был переход на 2000, а сейчас на 2005, + с ASP переводил на ASP.NET.
Кто-нибудь знает универсальный формат даты для ХП?
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Тогда попробуй перед вызовом процедуры добавить команду SET DATETIME dmy. То есть полный текст команды будет: cmd.CommandText="SET DATETIME dmy; EXEC sp_name @status=0,@dat='03.16.2005 04:01:17'" Также в T-SQL существует переноимсый формат даты, но он распространяется только на дату без времени. Это строка вида 'yyyymmdd'. Для универсальной передачи даты можно использовать функцию CONVERT передавая ей нужный формат даты третьим параметром. Подробности смотри в Books online.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 28.10.2007 0:53
Сообщ.: 83,
Visits: 593
|
|
Только не SET DATETIME dmy , а SET DATEFORMAT dmy - ничего не дает.
Поигрался с последовательностью и пришел к локальному выводу: 16.03.2005 04:01:17 - дд.мм.гггг подошло, странно ...
Посмотрел данные за прошлые года - там вообще было: гггг.мм.дд, потом мм.дд.гггг и только сейчас как на родине - дд.мм.гггг подошло.
Вывод: храните дату разделив ее на разные столбцы - отдельно год, месяц и день!
(так и сделано в половине таблиц, а вот во второй в одном поле - с ним и проблемы)
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
lurii (02.02.2007) Только не SET DATETIME dmy , а SET DATEFORMAT dmy - ничего не дает. Упс. Точно. Ошибся я.
lurii (02.02.2007) Вывод: храните дату разделив ее на разные столбцы - отдельно год, месяц и день! (так и сделано в половине таблиц, а вот во второй в одном поле - с ним и проблемы)Тут я с тобой не согласен. Лучше все таки хранить дату как тип "дата". Это более эффективно с точки зрения объема данных и дает возможность использования функций работы с датой (datediff, например). И опять же такой проблемы у тебя бы не было если ты передавал дату как параметр. Я помню что ты говорил про ограничения движка, просто напоминаю в чем реальный корень проблемы. Советую посмотреть исходный текст класса SqlHelper который я выкладывал в этой теме. Я им постоянно пользуюсь.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 28.10.2007 0:53
Сообщ.: 83,
Visits: 593
|
|
Да, посмотрел я этот класс - вполне удобно. У мня что-то похожее, причем идентично и на PHP и на .NET, но не позволяет использовать параметры - только чистый текстовый sql-запрос:<% if(sql_exec("select * from t_news")){ if(!rs_full()){ %>Нет записей<% }else{ while(rs_next()){ %><%=rs("name")%><% }; }; }; %>
Отличия на PHP - вместо % идет ? Надо будет поболее изучить SqlHelper и взять из него полезные возможности. (и все-таки использовать параметры у процедур неудобно IMHO)
|
|
|
|