Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.11;
Скачать: CL | DM;

Вниз

Странное поведение поля в Access   Найти похожие ветки 

 
DimonS   (2009-08-03 09:29) [0]

Ну может и не поля...
В общем, есть элементарный кусок кода:

ADOCommand1.CommandText:="update PathForms set TimeFact1=:TF1 where ...";
ADOCommand1.Parameters.ParamValues["TF1"]:=TimeFact1;
ADOCommand1.Execute;


Переменная TimeFact1 объявлена как TDateTime, значение, например, 40025,875.
Поле в таблице имеет формат Дата/Время.

В общем, при выполнении кода в таблицу вставляется только значение даты, время отсеивается.
В чем может быть причина?
В режиме отладки при присвоении параметру значения переменной TimeFact1 переменная не округлена до целого числа, с временем.
Если поменять код на такой:
ADOCommand1.Parameters.ParamValues["TF1"]:=Date+Time;
то записывается и дата и время в табличку, так что формат поля нормальный. Проблема именно при присвоении значения переменной.


 
Anatoly Podgoretsky ©   (2009-08-03 11:20) [1]

> DimonS  (03.08.2009 09:29:00)  [0]

Все таки TimeFact1 без времени. Не надо проверять в отладчике, используй или метку или ShowMessage


 
DimonS   (2009-08-04 01:43) [2]


> Anatoly Podgoretsky ©   (03.08.09 11:20) [1]
> > DimonS  (03.08.2009 09:29:00)  [0]
>
> Все таки TimeFact1 без времени. Не надо проверять в отладчике,
>  используй или метку или ShowMessage


В том-то и дело, что и ShowMessage показывает, что со временем переменная. Проверял по такому коду:

ShowMessage(FloatTostr(TimeFact1));
ADOCommand1.Parameters.ParamValues["TF1"]:=TimeFact1;


Выводит то же число: 40025,875.


 
DimonS   (2009-08-04 02:14) [3]

Проверил сейчас командой
ShowMessage(DateTimeToStr(TimeFact1));
Выводится "31.07.2009 21:00:00"

Вот. Куда еще копать - ума не приложу. Раскладывать число по-отдельности на дату и время и плюсовать? Вариант, записывает нормально. Но это же не выход, нерационально лишние вычисления делать.


 
sniknik ©   (2009-08-04 07:56) [4]

> Если поменять код на такой:
> ADOCommand1.Parameters.ParamValues["TF1"]:=Date+Time;
а если на такой?
ADOCommand1.Parameters.ParamValues["TF1"]:= Now();
или, что привычнее, на такой
ADOCommand1.Parameters.ParamByName("TF1").Value:= Now();
?


 
DimonS   (2009-08-04 08:30) [5]


> sniknik ©   (04.08.09 07:56) [4]

А кто сказал, что мне нужен Now()?
Нужно занести конкретную дату и конкретное время.


> ADOCommand1.Parameters.ParamByName("TF1").Value:= TimeFact1;

выдает тот же результат...


 
Anatoly Podgoretsky ©   (2009-08-04 08:52) [6]

> DimonS  (04.08.2009 08:30:05)  [5]

Так все таки, что с NOW


 
sniknik ©   (2009-08-04 09:15) [7]

> А кто сказал, что мне нужен Now()?
тубе нужна причина? тогда делай тесты и сообщай результат. или можно просто поболтать об этом (а лучше сразу закрыть тему, и вообще взять за правило закрывать ветки тех кто не отвечает на уточняющие вопросы... было бы неплохо).

про Now, я уверен что он возвращает, про TimeFact1 мне неизвестно ничего... даже не приведено его объявление. только твои слова о "чудесах" с ним.

> выдает тот же результат...
а чего ты ожидал? это же тоже самое просто более привычная форма. вот если бы там стояло Now как я писал и был бы тот же результат, это было бы чудом.


 
DimonS   (2009-08-04 09:42) [8]


> sniknik ©   (04.08.09 09:15) [7]

Понял, про что спрашивал.
Да, с Now записывает тоже только дату.
Если использовать Date+Time, то записывается нормально.
Если использовать такую конструкцию:
ADOFind.Parameters.ParamValues["TF1"]:=Int(TimeFact1)+Frac(TimeFact1);
то тоже записывается нормально.

Так вот...


 
Anatoly Podgoretsky ©   (2009-08-04 09:55) [9]

ADOCommand1.Parameters.ParamByName("TF1").Value := NOW;


 
DimonS   (2009-08-04 10:18) [10]


> Anatoly Podgoretsky ©   (04.08.09 09:55) [9]


Аналогично. Только дата.
Возникла мысль, что может это как-то связано с региональными стандартами и запятая не принимается? Хотя все по дефолту стоит, ничего не менялось.


 
Anatoly Podgoretsky ©   (2009-08-04 10:24) [11]

> DimonS  (04.08.2009 10:18:10)  [10]

Какая еще запятая у NOW


 
Dennis I. Komarov ©   (2009-08-04 10:26) [12]


> Какая еще запятая у NOW

временАя


 
Anatoly Podgoretsky ©   (2009-08-04 10:27) [13]


> ADOCommand1.Parameters.ParamByName("TF1").Value

И какое значение это имеет после присвоения?


 
MonoLife ©   (2009-08-04 10:38) [14]

А может насильно присвоить тип параметра?
ADOCommand1.Parameters.ParamByName("TF1").DataType:=ftDateTime;


 
DimonS   (2009-08-04 10:40) [15]


> Anatoly Podgoretsky ©   (04.08.09 10:27) [13]
>
> > ADOCommand1.Parameters.ParamByName("TF1").Value
>
> И какое значение это имеет после присвоения?


Сразу не проверил. Конец дня...
Значение: "04.08.2009 16:39:08"


 
DimonS   (2009-08-04 10:43) [16]


> MonoLife ©   (04.08.09 10:38) [14]
> А может насильно присвоить тип параметра?
> ADOCommand1.Parameters.ParamByName("TF1").DataType:=ftDateTime;
>


Проверил. Только дата...


 
Anatoly Podgoretsky ©   (2009-08-04 11:17) [17]

> DimonS  (04.08.2009 10:43:16)  [16]

Попробуй сменить. Во всяком случае причина в этом.


 
sniknik ©   (2009-08-04 11:48) [18]

> Проверил. Только дата...
а меняется тип при присвоении значения только если он ftUnknown, если другой то идет попытка конвертации.

возможно у тебя тип этого параметра где то устанавливается, может в прежнем запросе до вноса этого есть такой же параметр.


 
Anatoly Podgoretsky ©   (2009-08-04 12:16) [19]

На полноту ответов особо расчитывать не приходится. Может мы никогда не узнаем всю правду.


 
DimonS   (2009-08-05 01:28) [20]


> Anatoly Podgoretsky ©   (04.08.09 12:16) [19]

Ну немного разные часовые пояса у нас, потому и не сразу отвечаю :)

Как я понимаю, так правильно:
ADOCommand1.Parameters.ParamByName("TF1").DataType:=ftDateTime;
ADOCommand1.Parameters.ParamByName("TF1").Value := Now;
ADOCommand1.Execute;


Ну вот хоть тресни, но записывается только дата и все.
Однако же если присваивать Date+Тime, то записывается и дата  и время.

Вот еще что попробовал:
ADOCommand1.Parameters.ParamByName("TF1").DataType:=ftFloat;
ADOCommand1.Parameters.ParamByName("TF1").Value := Now;
ADOCommand1.Execute;

Теперь записывается и дата и время.
Похоже что-то с конвертацией все-таки связано...


 
sniknik ©   (2009-08-05 07:52) [21]

выдели это в отдельный проект... т.е. одна форма с двумя кнопками, в базе одна таблица с одним этим полем, нажимаешь одну кнопку  записывается дата, другую  - со временем, в общем "чистый глюк", и выложи куда нибудь. очень уж хочется в "живую" посмотреть, а не со слов.


 
DimonS   (2009-08-05 09:12) [22]


> sniknik ©   (05.08.09 07:52) [21]

Куда кинуть? На мыло тебе устроит? А то на работе позаблокировали все...


 
DimonS   (2009-08-05 09:44) [23]

Вот, выложил.
http://ifolder.ru/13406792

Проверил сейчас на другой машине - такое же поведение.
Возможно еще в строке подключения что-то напутал...


 
DimonS   (2009-08-05 09:52) [24]

Все проясняется.
Если использовать провайдера Microsoft Jet, то конвертация и запись происходит нормально.
Но к той базе, что я пытаюсь изм енить через него подключиться не получается, вылазит ошибка:
Не выполнена проверка подключения из-за ошибки инициализации поставщика. ..
Почему так происходит - не знаю, программа сторонних разработчиков. Пришлось использовать ODBC Drivers.

PS. Разработчики сказали, что тоже через ODBC их программа с базой общается.


 
DimonS   (2009-08-05 10:53) [25]

Если кто писать-спрашивать будет, то отвечу только завтра, ибо рабочий дэн закончился уже :)


 
sniknik ©   (2009-08-05 21:37) [26]

неправильно ODBC тип дататайм интерпретирует...
похоже выход задавать тип флоат как в > DimonS   (05.08.09 01:28) [20]
или jet...
Не выполнена проверка подключения из-за ошибки инициализации поставщика. ..
вот этого не может быть, поставщик есть и он работает даже в случае твоего подключения к ODBC
вот попробуй в своем тесте выполни
ADOCommand1.CommandText:= "select * from TestNone"; //знаю что такой таблицы нет
ADOCommand1.Execute;

и ВНИМАТЕЛЬНО прочитай ошибку.

т.е. с jet это твой "косяк", и разработчиков если они по той же причине используют ODBC.
хочешь выложи еще и базу. проверю. хотя лучше сначала попробуй сам.


 
DimonS   (2009-08-06 02:39) [27]


> sniknik ©   (05.08.09 21:37) [26]

ADOCommand1.CommandText:= "select * from TestNone";

Я так понял сделать запрос к базе, к которой Jet не подключается?

Через ODBC:
Project "" raizet exception class EOleExpection with message "[Microsoft][Драйвер ODBC Microsoft Access]Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос"TestNone"...

Если в ADOCommand1.ConnectionString прописать драйвер MS Jet, то при выполнении запроса (проверка подключения не происходит, ошибку я выше писал) другая ошибка:
Project "" raizet exception class EOleExpection with message "Не удается запустить приложение. Системная база данных отсутствует или открыта с монопольным доступом другим пользователем".

Естетсенно, с монопльным доступом она открыта быть не может, с ней одновременно работают несколько человек. Да и через ODBC работает-то нормально.
Да, если это имеет значение, база запоролена.

Выслать, в  принципе, можно, если почистить, так она довольно тяжелая. Самому интересен этот факт, но в инете шарился - не нашел ответа (правда, давно уже). Да чего уж говорить, если сами разработчики не смогли ответить :)


 
sniknik ©   (2009-08-06 08:03) [28]

> Я так понял сделать запрос к базе, к которой Jet не подключается?
> Через ODBC:
> [Microsoft][Драйвер ODBC ... Ядро базы данных Microsoft Jet не может  ...
ни о чем не говорят слова в ошибке?

> Да и через ODBC работает-то нормально.
а тот факт, что эта надстройка воспринимает(и исправляет) тип дататайм на тип дата, это нормально?

> Да, если это имеет значение, база запоролена.
только то значение, что видимо на составлении чуть более сложной строки с паролем вы с разработчиками и "поломались", ведь сам jet то работает, ODBC его вызывает...

> Выслать, в  принципе, можно
строку подключения для начала приведи, и какой там пароль, на базу или на юзера? (ели на юзера то требуется еще файл system.mdw, вроде)
> Да чего уж говорить, если сами разработчики не смогли ответить :)
ламеры разрабатывали? или отвечал, как обычно студент, на полставки... берут таких в цто, сами ничего не знают.


 
DimonS   (2009-08-07 05:19) [29]


> ни о чем не говорят слова в ошибке?

Понятно, что через MS Jet цепляется.


> а тот факт, что эта надстройка воспринимает(и исправляет)
> тип дататайм на тип дата, это нормально?

Да вот не знаю, может она и ни причем, где-то в системе ошибка вкралась, хотя и не исключаю.


> только то значение, что видимо на составлении чуть более
> сложной строки с паролем вы с разработчиками и "поломались",
>  

А это как понять? Пароль 17-значный, не я его придумывал. И по делу он там как козе припарка.

Строка подключения:
Provider=MSDASQL.1;Password=ldofmer9ERG40Gweg;Persist Security Info=True;Data Source=База данных MS Access;Mode=ReadWrite;Extended Properties="DSN=База данных MS Access;DBQ="+Regini.ReadString(*,*,"")+";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=ldofmer9ERG40Gweg;";Initial Catalog="+Regini.ReadString(*,*,"")
Составлял обычным мастером в ConnectionString ADOConnection-а.

Пароль на базу или юзера? Хм, вопрос интересный. Не задавался им. На базу скорее всего, потому как запрашивается только пароль.

Ну а насчет разработчиков... Не ламеры, наверное, может просто не захотели выдавать все тонкости.

PS. Пароль в строке подключения.


 
sniknik ©   (2009-08-07 08:01) [30]

> Да вот не знаю, может она и ни причем
как это не причем? если без нее нормально с этим типом работает с ней глючит. кто тогда причем?

> Строка подключения:
и зачем строка к ODBC, если говорили про Jet? в ней же ошибка, а эта так понимаю рабочая.

> Пароль на базу или юзера? Хм, вопрос интересный.
PWD - на базу.

> может просто не захотели выдавать все тонкости.
это не их "тонкости", это общие знания по работе с access. или у них синдром партизана?


 
DimonS   (2009-08-07 09:10) [31]


> sniknik ©   (07.08.09 08:01) [30]

Вот неработающая строка подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Password=ldofmer9ERG40Gweg;Data Source="+Regini.ReadString(*,*,"")+";Persist Security Info=True

Создал точно так же через мастера.


 
sniknik ©   (2009-08-07 15:50) [32]

> Вот неработающая строка подключения:
Password - это на юзера. естественно не работает, дальше можно не смотреть. погугли на эту тему.


 
DimonS   (2009-08-10 08:19) [33]


> sniknik ©   (07.08.09 15:50) [32]

Спасибо за направление поиска! Разобрался, все работает.



Страницы: 1 вся ветка

Текущий архив: 2009.10.11;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.012 c
15-1250046417
novai
2009-08-12 07:06
2009.10.11
Не ставится GLScene


2-1249812910
Дмитрий
2009-08-09 14:15
2009.10.11
Рандомное слово


15-1250109003
Юрий
2009-08-13 00:30
2009.10.11
С днем рождения ! 13 августа 2009 четверг


9-1182245762
Домик
2007-06-19 13:36
2009.10.11
Как из двух изображений получить TGA с альфа каналом?


4-1219228987
POP
2008-08-20 14:43
2009.10.11
Интересный баг с COM портом.