информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
С DAO сталкивался давным-давно, но не помню почему - на ODBC... 30.03.15 15:06  Число просмотров: 7934
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
С DAO сталкивался давным-давно, но не помню почему - на ODBC остановился. Я разные форматы даты пытался скормить Access'у. В том числе и такой:
INSERT INTO [User] ( id, date)
VALUES (1, #2014-02-02#);

Но он даже сохранять такой запрос не хочет, говоря, что допущена ошибка синтаксиса в операторе INSERT
<beginners>
[WinAPI] Как через SQLExecDirect передать дату SQL-запросу? 30.03.15 12:05  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 30.03.15 12:07  Количество правок: 2
<"чистая" ссылка>
И вновь я с извращенским вопросом. Понимаю, что сейчас на низком уровне программировать БД уже не модно, но мне очень надо ))). Работаю с Visual C++ 6.0 (понимаю, антиквариат – ну люблю я её…) Мне надо, чтобы заработал примерно такой код:

wsprintf(szQuery, "INSERT INTO User (id, date) VALUES (%d, '%s')", dwId, "#23.07.2014#"); ret = SQLExecDirect(hStmt, (SQLTCHAR *) szQuery, lstrlen(szQuery))

Но вот не хочет он работать. Считывать уже ранее занесённое в БД значение даты получается в переменную типа DATE_STRUCT, но вот обратное действие – запись в БД, не могу придумать как сделать.

Перекопал заголовочные файлы с датой, в МСДН прокопался, но так ничего и не додумал. Подскажите пожалуйста, как проделать этот трюк?

PS. В Качестве СУБД использую MS Access. Но даже там при ручном формировании запроса так и не смог понять, в каком виде оператору INSERT дату передавать.
Плохо пишешь... Без экранирования введенных пользователем данных рискуешь получить SQL-injection [upd] 30.03.15 15:35  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 01.04.15 10:33  Количество правок: 3
<"чистая" ссылка>
Если запрос выполняется единожды и больше не повторяется в процессе работы программы, то SQLExecDirect, конечно, можно использовать. В остальных случаях лучше использовать параметризованный запрос, подготовленный с помощью SQLPrepare.
После подготовки запроса тебе надо сделать SQLBindParameter, затем SQLExecute. Пример использования смотри в конце описания функции SQLBindParameter.

Windows Data Access Components SDK: https://msdn.microsoft.com/en-us/library/aa968814(v=vs.85).aspx
ODBC API Reference: https://msdn.microsoft.com/en-us/library/ms714562(v=vs.85).aspx

[upd]
> PS. В Качестве СУБД использую MS Access.
> Но даже там при ручном формировании запроса так и не смог понять,
> в каком виде оператору INSERT дату передавать.

В самом Access'е дата должна представляться внутри запроса через '#' без символов строки
"INSERT INTO User (id, date) VALUES (0, #23.07.2014#)"

Самый вменяемый хелп по ассексу присутствует только в MS Access 97. Хелпы последующих ассексов выглядят как шлак. Вот о чем нам повествует вышеупомянутый хелп:
"Переменные типа Date (значения даты и времени) сохраняются как 64-разрядные (8-байтовые) числа с плавающей точкой стандарта IEEE, представляющие даты в диапазоне от 1 января 100 г. до 31 декабря 9999 г. и значения времени от 0:00:00 до 23:59:59. Переменным типа Date могут быть присвоены любые значения, задаваемые распознаваемыми датами в явном представлении (литералами даты). Литералы даты следует окружать символами (#), например, #January 1, 1996# или #1 Jan 96#.

Значения типа Date выводятся с использованием краткого формата даты, установленного для компьютера. Значения времени выводятся в установленном 12-часовом или 24-часовом формате.
При преобразовании других числовых типов данных к типу Date целая часть числа представляет значение даты, а дробная значение времени. Полночь представляется значением 0, а полдень значением .5. Отрицательные целые числа представляют даты до 30 декабря 1899 г."


SQLPrepare
SQLBindParameter
SQLExecute
ANSI SQL Date кодируется строкой вида YYYY-MM-DD, используй этот формат. MS DAO не пробовал гонять? Он прикольный ) 30.03.15 13:39  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
С DAO сталкивался давным-давно, но не помню почему - на ODBC... 30.03.15 15:06  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
С DAO сталкивался давным-давно, но не помню почему - на ODBC остановился. Я разные форматы даты пытался скормить Access'у. В том числе и такой:
INSERT INTO [User] ( id, date)
VALUES (1, #2014-02-02#);

Но он даже сохранять такой запрос не хочет, говоря, что допущена ошибка синтаксиса в операторе INSERT
Я фигню тебе написал сорри, не DAO, ADO конечно же, ActiveX Data Objects. 30.03.15 18:03  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 30.03.15 18:05  Количество правок: 2
<"чистая" ссылка>
> форматы даты пытался скормить
> Access'у. В том числе и такой:
> INSERT INTO [User] ( id, date)
> VALUES (1, #2014-02-02#);
Subj, а поскольку ActiveX, то соответственно, работает преотлично в любом языке/среде программирования, работающем с ActiveX, хоть в IE на JavaScript'e ;), не говоря уже про VB скрипты в продуктах MS. В С/С++ тоже можно каэшь, типа микроскопом гвозди позабивать ))

> Но он даже сохранять такой запрос не хочет, говоря, что
> допущена ошибка синтаксиса в операторе INSERT
А зачем символами решётки обрамляешь? Заключи в кавычки, например. Ну и про экранирование Den всё правильно тебе пишет...
Символы решетки - чисто Access'овская фишка. Синтаксис такой... 31.03.15 00:37  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Den, спасибо – полезная информация по SQLPrepare. HandleX, я... 31.03.15 07:13  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Den, спасибо – полезная информация по SQLPrepare. HandleX, я и с решётками и без них в разной комбинации кавычек пробовал – всё равно ошибка получается. Даже в самом Access когда вручную запрос пишу. Спасибо конечно, но вы сами пробовали подобные запросы Access’у скармливать? Мне так и не удалось правильный формат передачи ему даты найти (((
Если мне не изменяет память, Access функция CDate умеет... 01.04.15 10:17  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 01.04.15 14:49  Количество правок: 2
<"чистая" ссылка>
Если мне не изменяет память, Access функция CDate умеет прожевывать формат даты ISO 8601:
yyyy-mm-dd[Thh:mm:ss[.mmm]], где 'T' - признак начала значения времени.
Соответственно, тебе ничто не мешает использовать в SQLPrepare запрос вида: "INSERT INTO User (id, date) VALUES (?, CDate(?))" и закинуть в этот запрос дату в виде строки формата ISO 8601 через SQLBindParameter.
[updated!] К сож., не могу помочь — на всех моих компах нет Access, дистриб офиса без него. 31.03.15 14:19  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 31.03.15 14:48  Количество правок: 3
<"чистая" ссылка>
<UPDATE>
Вот тут http://stackoverflow.com/questions/771861/insert-sql-command-with-datetime-in-ms-access чуваки пишут, что кроме решёток, используй также одинарные кавычки — попробуй с ними ещё, работает?
</UPDATE>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach