Текущий архив: 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.54 MB
Время: 0.005 c