информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetГде водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и 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 <Денис Т.> Статус: 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 <Денис Т.> Статус: 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 <Денис Т.> Статус: 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