Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];

Вниз

Странное поведение поля в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.407 c
15-1250078881
young delphi master
2009-08-12 16:08
2009.10.11
Текстовый редактор


15-1249924835
@!!ex
2009-08-10 21:20
2009.10.11
Где найти книг во вселенной BattleTech?


2-1249545112
Dennis I. Komarov
2009-08-06 11:51
2009.10.11
AV


15-1250061319
JS
2009-08-12 11:15
2009.10.11
Шрифт


15-1250149486
McSimm
2009-08-13 11:44
2009.10.11
Книги дешевле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский