![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MS SQL в ХР и 2000 Вмндоусе. Почему работает по разному? [D6, MSSQL]
DimonS © (2006-04-26 05:20:00)Есть база в MS SQL (спутниковое наблюдение - GPS).
Есть программа для просмотра пробега авто за любой промежуток времени. Работает так: при запуске делается выборка данных, а затем из нее методом фильтрации выбирается нужный диапазон (база на серваке, который соединен радиомомедом, поэтому изначально делалось на фильтрации, т.к. не всегда есть доступ и иногда очень медленный).
Так вот...
Фильтр такой:
s:='TimeNav>='''+DateToStr(StrToDateTime(DateEdit1.Text+' '+MaskEdit3.Text))+''' and TimeNav<='''+DateToStr(StrToDateTime(DateEdit2.Text+' '+MaskEdit4.Text))+''' and UniqId='+QT.fieldByName('Uniq_ID').AsString;
QP.Filter:=s;
В ХР работает на ура! А в 2000 ни в какую - QP.Filter:=s; - не присваивается значение s фильтру. Разборка полета дала, что ошибка где-то в преобразовании даты. Пробовал дату преобразовать в Float - то же самое.
Пошел по пути делать выборки.
QP.Close;
QP.SQL.Clear;
QP.SQL.Add('select TimeSys, TimeNav,UniqID,Distance from Distance_all where TimeNav>'+D1+' and TimeNav<='+D2+' and UniqId='+QT.fieldByName('Uniq_ID').AsString+' order by Timenav');
QP.Open;
Ругается на запятую в формате даты.
Сделал:
D1:=ReplaceStr(FloatToStr(StrToDateTime(DateEdit1.Text+' '+MaskEdit3.Text)),',','.');
D2:=ReplaceStr(FloatToStr(StrToDateTime(DateEdit2.Text+' '+MaskEdit4.Text)),',','.');
(заменил запятую на точку) - работает, НО! Выбираются данные на 2 дня позже почему-то... Да и кривой, конечно, способ заменять запятую, на другом серваке формат даты другой могет быть...
Вот и вопрос - что за трабл такой?
DimonS (2006-05-11 16:03:00) [1]ТО
> VadimSpb (29.04.06 13:28) [26]
Спасибо, единственный, кто подсказал нормально, просто применил пример, которого я и ждал. Все работает отлично. (Хотя фильтрация не работает, но это уже не важно).
Через параметры проверил на машинах с 95, 98, 2000 и МЕ виндой, все работает!
DimonS (2006-04-29 13:35:00) [2]Спасибо всем, теперь понятно, в чем апшипкИ :). Негде попробовать сейчас, дома ХРю стоит, придется ждать допослепразников.
VadimSpb (2006-04-29 13:32:00) [3]И еще: РАБОТАЙ С ДАТОЙ ТОЛЬКО ЧЕРЕЗ ПАРАМЕТРЫ
VadimSpb (2006-04-29 13:28:00) [4]Посмотри пример для MSSQL:
DataModule1.ADOCommand.CommandText := 'INSERT INTO HistoryConnect2 (AbonentID,ConnectDate,DisconnectDate) VALUES (:AbonentID,:ConnectDate,:DisconnectDate)';
DataModule1.ADOCommand.Parameters.ParamValues['AbonentID'] := DataModule1.tbAbonentAbonentID.AsInteger;
DataModule1.ADOCommand.Parameters.ParamValues['ConnectDate'] := Int(DateTimePicker1.Date);
DataModule1.ADOCommand.Parameters.ParamValues['DisconnectDate'] := Int(DateTimePicker6.Date);
DataModule1.ADOCommand.Execute;
DimonS (2006-04-29 13:16:00) [5]
> дельфе дататайм это число с плавающей запятой, а в mssql
> (насколько помню) два составленных целых одно под дату другое
> под время
Вот наконец то подсказали, чем форматы отличаются! Получается, что региональные настройки и ни при чем. Буду пробовать после праздников :)
sniknik (2006-04-29 13:11:00) [6]> нужно обязательно переводить в число
в дататайм, а не число. тут тип имеет значение, хотя суть типа тоже число... вот если бы ты внутри одной системы манипуляции делал то было бы без разници.
там не только точки отсчета разные но и к примеру в дельфе дататайм это число с плавающей запятой, а в mssql (насколько помню) два составленных целых одно под дату другое под время. при передаче числом оно конечно может автоматически преобразовать тип, но потери в точности будут.
DimonS (2006-04-29 13:02:00) [7]
> sniknik ©
Спасибо, попробую. А ведь Акцесс не принимает дату в строковом виде, нужно обязательно переводить в число. А mssql число не принимает. Просто mssql почти не касался, а с Аксессом небыло таких траблов, вот и мучуюсь. :)
sniknik (2006-04-29 10:37:00) [8]> Дата вводится через DateEdit, из библиотеки RxLib, так что ввести неправильно ее невозможно.
зато после она у тебя преобразовывается в число... число это не дата (по типу, так то она конечно числом представлена), в принципе ничего страшного когда в одной системе, но у тебя идет передача между системами... точка отсчета даты (ноль) может быть разной, ты это не учитываеш и + обманываеш систему что это число а не дата... т.е. она тоже не учитывает.
ну тогда и не жалуйся
> НО! Выбираются данные на 2 дня позже почему-то...
> ведь на другой машине может оказаться другие настройки и опять будут те же ошибки, так ведь?
используй параметры (обязательно того типа который есть самом деле) либо передавай строкой в универсальном формате движка (для mssql это "yyyymmdd" или "yyyy-mm-dd", для аксесс #yyyy-mm-dd# уточни в справке)
DimonS (2006-04-29 03:19:00) [9]Ну вот еще добавлю.
Дата вводится через DateEdit, из библиотеки RxLib, так что ввести неправильно ее невозможно.
Доступ осуществляется через ADO.
ShortDateFormat и LongDateFormat не хотелось бы использовать, ведь на другой машине может оказаться другие настройки и опять будут те же ошибки, так ведь?
atruhin (2006-04-27 16:07:00) [10]Ну значит забыл. Сдаюсь.
Nikolay M. (2006-04-27 16:04:00) [11]
> Хотя может я и не прав.
Еще в четверке был, как минимум.
atruhin (2006-04-27 15:53:00) [12]
> На худой конец MaskEdit
Ну дак я его и имел ввиду.
> Палитра компонентов Win32 -> DateTimePicker.
А вот он мне кажется только в 7ке появился. Хотя может я и не прав.
Nikolay M. (2006-04-27 15:23:00) [13]
> Использовал в D6 там вроде не было стандартного компонента
> ввода дат
Палитра компонентов Win32 -> DateTimePicker. На худой конец MaskEdit.
MOA (2006-04-27 15:02:00) [14]>региональные настройки на своей машине, на той, где стоит 2000 винда (где программа не работает) и на сервере. ВЕЗДЕ ОДИНАКОВЫЕ!!!
Похоже, компоненты доступа используют DB Library (BDE, например) - тогда региональные установки есть ещё в SQL Server Client Network Utility - вкладка "DB Library Options".
Удачи!
atruhin (2006-04-27 14:57:00) [15]
> Зачем самому создавать проблемы там, где их нет?
Ну про периодически я переборщил :). Использовал в D6 там вроде не было стандартного компонента ввода дат, несколько раз нужно было написать модули без использования сторонних компонент.
Nikolay M. (2006-04-27 14:33:00) [16]
> except
> // вывод сообщения пользователю
Проблема будет с пользователи, которые будут вбивать правильную, по их мнению, дату, а потом окажется, что "эта дурацкая программа не понимает дату и выдает какие-то окошки".
Зачем самому создавать проблемы там, где их нет?
atruhin (2006-04-27 14:18:00) [17]
> [1] Nikolay M. © (26.04.06 10:31)
> сплошь и рядом лепил такое
> > StrToDateTime(DateEdit1.Text)
> Поубивал бы, если бы его раньше не уволили
А в чем здесь проблемма? Я периодически использую для контроля правильности введенной даты.
try
StrToDateTime(DateEdit1.Text)
except
// вывод сообщения пользователю
end
Nikolay M. (2006-04-27 10:07:00) [18]
> КАК СДЕЛАТЬ ТАК, чтобы программа работала на машинах с разными
> региональными настройками?
Ты ответы читаешь или будешь продолжать истерить?
> Не храни даты и вещественные числа в строках - и будет тебе
> счастье.
Для повышения образованности можешь почитать про ShortDateFormat и LongDateFormat, о чем тебе было сказано еще в [3] - в хелпе про StrToDateTime все это разжевано.
> > А StrToDateTime ('Пишу сюда все, что захочу')?
>
> Я надеялся получить дату-время в формате DateTime.
И какое же будет дата-время у StrToDateTime ('Пишу сюда все, что захочу')?
atruhin (2006-04-27 03:51:00) [19]См. использование параметров в хапросах. Это не просто, а очень просто! :)
DimonS (2006-04-27 02:49:00) [20]
> Уже тут несколько раз говорили — региональные настройки.
Ну ясен пень, это я понял еще до того, как написал сюда. Вопрос в том, КАК СДЕЛАТЬ ТАК, чтобы программа работала на машинах с разными региональными настройками? Или никак?
ЗЫ. Проверил региональные настройки на своей машине, на той, где стоит 2000 винда (где программа не работает) и на сервере. ВЕЗДЕ ОДИНАКОВЫЕ!!! Но... Что-то видно еще влияет.