![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вставка даты в Access [D6, Access]
makaronX © (2007-01-08 18:56:00)помогите победить:
adoquery1.SQL.Add('insert into baza values (' + labelededit2.text + ', ' + datetostr(datetimepicker1.Date) + и т. д.
при выполнени ругается на дату:
Число содержит синтаксическую ошибку в выражении запроса '08.01.2007'
Anatoly Podgoretsky (2007-01-09 15:23:00) [1]> palva (09.01.2007 10:07:17) [17]
А преданость у собак какая.
palva (2007-01-09 10:07:00) [2]> подамся ка я в дрессировщики собак
Это я согласен, с людьми много трудностей возникает.
sniknik (2007-01-09 02:02:00) [3]palva © (09.01.07 01:37) [12]
> Если # заменить на ', то "Несоответствие типов данных в выражении условия отбора"
sniknik © (08.01.07 23:55) [8]
> вот именно в этом конкретном случае ( insert) сойдет и строка
пост можно рассматривать как пример, сказанного о том что испортить можно все
sniknik © (08.01.07 23:55) [8]
> про "всеядность" jet-а?... ну относительную конечно (испортить все можно)
не, ну вот надо же, специально предупреждал "в этом конкретном случае", значит логично, что не в этом, не в конкретном работать не будет, и на тебе...
p.s. меня все чаще разочаровывают люди, подамся ка я в дрессировщики собак... они хотя бы понимают все как есть, буквально.
palva (2007-01-09 01:50:00) [4]sniknik © (09.01.07 00:08) [9]
Ваш INSERT действительно работает. Вот это для меня новость.
palva (2007-01-09 01:42:00) [5]Сейчас буду пробовать INSERT
Anatoly Podgoretsky (2007-01-09 01:39:00) [6]> palva (09.01.2007 01:37:12) [12]
Кто просил 4.10, просили пробовать с 4.30
palva (2007-01-09 01:37:00) [7]Я все-таки попробовал. Вот такой код:
{$APPTYPE CONSOLE}
uses ActiveX, ComObj, Variants;
var
cn, rs: OleVariant;
begin
CoInitialize(nil);
cn := CreateOleObject('ADODB.Connection');
cn.Open('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=db1.mdb;');
rs := CreateOleObject('ADODB.Recordset');
rs.Open('SELECT * FROM table1 Where f2 = #10/4/2006#', cn, 0, 1);
WriteLn(rs.Fields.Item['f1']);
ReadLn;
end.
Windows 2000, Локаль русская, Офис 2000 русский, MDAC 2.8, Turbo Delphi
В таблице запись с датой 4.10.2006. И этот код работает.
Если # заменить на ', то "Несоответствие типов данных в выражении условия отбора"
Если в дате поменять местами 4 и 10, то не находит ни одной записи (и, естественно, дает ошибку на следующей строке).
Так что я вынужден повторить:
Даты в SQL-предложениях акцесса нужно ограничивать символом #. Никакой Jet здесь не помогает.
Порядок "дата/месяц" должен быть американским даже если локаль требует иного задания.
То что этот порядок переворачивается для достижения валидности даты мне было известно, но я ведь с этим и не спорил.
Anatoly Podgoretsky (2007-01-09 01:03:00) [8]Можешь не пробовать, Акцесс весьма вольно обращается с датами
palva (2007-01-09 00:30:00) [9]sniknik © (09.01.07 00:08) [9]
Спасибо, сейчас посмотрю.
sniknik (2007-01-09 00:08:00) [10]ну вот пример
таблица с 3-мя полями, автоинкремент, строковое и дата тайм
делаем по очереди запросы
первый
INSERT INTO Table1 (Name, Dat) VALUES ('Test 1',"30.01.2007")
второй
INSERT INTO Table1 (Name, Dat) VALUES ("Test 2",'01.30.2007')
чего как думаешь в дату запишет?
можеш не гадать выполни и посмотри, ошибок не будет (не должно быть...)
как и от следующего
SELECT #30/01/2007#, #01-30-2007#
чего кажет?
параметры дают всетаки определенности поболе... к тому же и отрабатывает запрос с ними немного быстрей.
потому и советуют пользоваться именно ими.
sniknik (2007-01-08 23:55:00) [11]> А вы в курсе что даты в акцессе в командах SQL положено заключать в скобки типа # #
;о) а ты до этого, немного ранее, не читал пару постов про "всеядность" jet-а?... ну относительную конечно (испортить все можно), нет? ну тогда счас прочти, вот именно в этом конкретном случае (insert) сойдет и строка, сработает авто приведение типа.
и порядок может и зависеть и не зависеть от локальных установок, смотря какая дата будет и что приводится...
говорю же, уж слишком черезчур "всеяден", по мне так было бы лучше больше четкости и ошибки в сомнительных случаях, меньше проблем было бы... но не могу к сожалению влиять на разработчиков движка. ;о(
palva (2007-01-08 23:35:00) [12]> datetostr(datetimepicker1.Date)
А вы в курсе что даты в акцессе в командах SQL положено заключать в скобки типа # #, а не в апострофы? И порядок "месяц/день" должен быть американским вне зависимости от локальных установок.
sniknik (2007-01-08 21:31:00) [13]> Дело в том, что Джет жует и не давится от строчных дат.
даже слишком многим "не давится", а надо бы, т.к. гораздо лучше получить явную ошибку вот прям тут на месте, при написании, чем логическую и "через раз", не пойми когда/где "грянет".
и только потому что интерпретация даты в строке jet-том, почемуто отличается от того что ожидали/системных настроек...
MsGuns (2007-01-08 21:09:00) [14]Дело в том, что Джет жует и не давится от строчных дат.
Попробуйте
adoquery1.SQL.Add('insert into baza values (' + labelededit2.text + ', ' + QuotedStr(datetostr(datetimepicker1.Date) )+ и т. д.
Хотя справедливость [1] не отменяется ;)
Anatoly Podgoretsky (2007-01-08 20:51:00) [15]> makaronX (08.01.2007 18:56:00) [0]
Точно '08.01.2007', а не 08.01.2007
MsGuns (2007-01-08 20:38:00) [16]>sniknik © (08.01.07 19:21) [1]
>и вместо adoquery1 использовать adocommand1 в этом случае (insert ...).
Ну, в данном случае и квери сойдет. Хотя методологическинадо, конечно, как ты сказал ;)
makaronX (2007-01-08 19:46:00) [17]спасибо, sniknik
sniknik (2007-01-08 19:21:00) [18]использовать параметры и передавать датой, а не строкой, и вместо adoquery1 использовать adocommand1 в этом случае (insert ...).