Как правильно передать timestamp в хранимую процедуру

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Как правильно передать timestamp в хранимую процедуру

Сообщение smartyn » 12 июл 2006, 18:22

Возникла проблема с передачей timestamp в хранимую процудуру
Использую Firebird 1.5.3, C# и Firebird NET Data Provider 1.7.
на клиентской машине и на сервер разные региональные настройки.
вызываю храниую процедуру следующим образом

Код: Выделить всё

            FbCommand cmd = new FbCommand("select * from get_ipaddress(@time)", lConnection);
            cmd.Parameters.Add("@time", FbDbType.TimeStamp).Value = Time;
            FbDataReader reader = cmd.ExecuteReader();
Если Time например равен 01.07.2006 00:00:00 то в результате я получаю данные за 7 января 2006 года

а если устанавливаю одинаковые региональные настройки то получаю инфо за 1 июля 2006 года.
Подскажите как можно программно установить необходимый формат даты для работы с хранимыми процедурами

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 июл 2006, 19:45

А що, это бисово, то есть тьфу, Биллино, отродье параметры только строками умеет принимать, прямо TDateTime'ом - не-а?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 июл 2006, 21:55

отож. ненавижу варианты, и никому ими пользоваться явно не советую.

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 11:02

подскажите какие тогда существуют методы предачи параметров в хранимую процедуру применительно к Firebird NET Data Provider 1.7
насколько я понял в Dataprovider-е параметры передаются только как вариант, или есть другие способы?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 июл 2006, 13:18

стандартные методы asString, asInteger и т.п. присутствуют?

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 13:28

Вроде не наблюдаются :( в C# такого не замечал

есть Value типа object (что то вроде Variant но несколько умнее)
есть метод AddParameter которому указываю имя параметра и его тип как результат получаю экземпляр класса FbParameter у котороого есть свойство Value вот вроде и все

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 13 июл 2006, 13:34

smartyn писал(а):есть Value типа object (что то вроде Variant но несколько умнее)
Ну какой же это Вариант. Это базовый класс, который в Delphi TObject называется...

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 13:41

сорри, конечно Вы правы, это базовый класс для всех классов фреймворка.

Но от этого не становиться легче :(

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 июл 2006, 14:34

для начала надо определиться, что "региональные настройки" серверу и клиенту до лампочки, и формат преобразования строки в двоичный вид, передаваемый клиенту и серверу, определяется только клиентским приложением.
Например, классический случай - помещение в параметр значения, принимаемого из строки ввода. Строка в дату преобразуется не клиентом и не сервером IB/FB. Она преобразуется используемыми компонентами, в данном случае провайдером .Net. В соответствии с локалью, получаемой приложением при старте.
Даже если бы и был asDateTime, это просто облегчило бы "бесформатную" трансляцию из даты в дату. Но с конвертацией из строки в дату все равно ситуация останется такой, как я ее описал выше.

Если же на сервер дата/время передается как строка, то она должна быть в стандартном формате, понимаемым сервером. dd.mm.yyyy, mm/dd/yyyy или dd-mmm-yyyy.

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 14:47

т.е. если есть такой фрагмент

Код: Выделить всё

DateTime Time=DateTime.Now;
FbCommand cmd = new FbCommand("select * from get_ipaddress(@time)", lConnection); 
cmd.Parameters.Add("@time", FbDbType.TimeStamp).Value = Time; 
FbDataReader reader = cmd.ExecuteReader();
Net провайдер не будет выполнять преобразований даты и передаст на сервер значение в двоичном виде?
если так то наверно я что то не так установил или настроил :(

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 июл 2006, 14:50

Net провайдер не будет выполнять преобразований даты и передаст на сервер значение в двоичном виде?
ээээ... я как раз и говорю о том, что при присвоении Value и происходит то самое преобразование, которое приводит к твоей "проблеме". Я понятия не имею, как эти типы хранятся и обрабатываются в C# и .Net.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 июл 2006, 14:54

Помойму тут НЕТчиков вообще нет. Пожалуй в данном конкретном случае кросс-пост на http://www.sql.ru/forum/actualtopics.aspx?bid=2 будет уместным, там они вроде встречаются.

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 14:57

спасибо за помощь

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 13 июл 2006, 15:22

Merlin писал(а):Помойму тут НЕТчиков вообще нет.
Товарищ, вы не правы :D. Я Хорошо знаю C# и немного знаю сам .NET (1.1 и 2.0). Просто с базами почти не работал, так бы подсказал чего. Полгода назад делал проект с одной сеткой, проверил, что в сетку заливается таблица через провайдер и все. Глубже не копал.

Оффтоп: 2 smartyn. А у тебя как с отрисовкой форм? Нет мерцания при пролистывания TabControl'а или просто при отображении формы?

smartyn
Сообщения: 7
Зарегистрирован: 12 июл 2006, 18:09

Сообщение smartyn » 13 июл 2006, 15:30

тоже офтоп. у меня вообщето service а не GUI приложение, так что мигания при отрисовке не наблюдаю в связи с отсутствием
а те GUI приложения что делал нормально отрисовывались (ну на целероне 677 с 256МБ были тормоза, но то вопрос к железу)

Ответить