Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MS SQL + ADO + DateTime [D7, MSSQL]


Jungle ©   (2004-03-26 10:24:00) 

Есть запрос типа 'INSERT INTO TableName (rDateTime) VALUES (:parDateTime);' (хранится в ADOQuery1)

параметр parDateTime типа ftString

и следующий код:

...
ADOQuery1.Parameters.ParamValues['parDateTime'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', tmpDate); //tmpDate - типа TDateTime
...
ADOQuery1.ExecSQL;
...

Так вот, в одной программе всё работает пучком, в другой упорно не хочет, выдаётся ошибка "...[Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована." Ничего не понимаю. Натолкните на мысль, уважаемые...


Jungle   (2004-03-29 14:43:00) [1]

2 KSergey

Понимаешь, у меня никак не получалось запихать дату/время в таблицу. Я нашёл пример, где параметр был типа ftString. Всё заработало, а почему - мне как-то побоку.


Fay   (2004-03-26 20:31:00) [2]

чтобы оптимизатору крышу сносить


KSergey   (2004-03-26 16:24:00) [3]

> parDateTime типа ftString

Мне лично вот это как раз не понятно... Зачем "типа ftString"?


Jungle   (2004-03-26 15:22:00) [4]

Уфф. Вроде заработало. Спасибо.
Вот что значит невнимательно читать :)
Пожалуй погожу теперь помирать :)


sniknik   (2004-03-26 15:11:00) [5]

> Блин. Убейте меня.
будь завтра в условленом месте часов так в 11-12.

> А если делать как я, то не работает. Не понимаю почему.
перечитай внимательно пост [3] второй абзац. решение там.


Jungle   (2004-03-26 15:05:00) [6]

Блин. Убейте меня.
Дело вот в чём. в запросе у меня слово TableName. По ходу работы я функцией StringReplace заменяю его на имя настоящей таблицы. Так вот. Если указать имя таблицы сразу, то всё замечательно работает. А если делать как я, то не работает. Не понимаю почему.
Подскажите как правильно сделать, а то совсем ни черта не соображаю уже. Через параметр не выходит.


Fay   (2004-03-26 14:38:00) [7]

>> .Parameters.ParamValues['parDateTime'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', tmpDate
Тут ему не хватит кавычек 8)


Jungle   (2004-03-26 13:39:00) [8]

Я в ADOConnection пересоздал строку подключения и всё заработало. Только непонятно почему, т.к. при запуске программы я всё равно создаю dsn-файл и в ADOConnection.ConnectionString := 'FILE NAME=x:\prog\config.dsn'. Или я торможу или одно из двух... А, скорее всего, третье :)


sniknik   (2004-03-26 12:38:00) [9]

Johnmen ©   (26.03.04 12:16) [5]
ответственно подтверждаю. ;о))

Jungle   (26.03.04 12:27) [6]
дело явно в коде (том что скрывается за точками в первом посте).
или в соответствиях типа в связке "поле в таблице"-"параметр"-"задаваемое значение".


Jungle   (2004-03-26 12:37:00) [10]

> Это как ? Откуда уверенность ?

Что значит как? Во-первых, выдается та же самая ошибка при ExecSQL. Во вторых, в таблице ничего не добавляется. Или я недопонял вопроса.?


Johnmen   (2004-03-26 12:30:00) [11]

>не работает

Это как ? Откуда уверенность ?


Jungle   (2004-03-26 12:27:00) [12]

Проверил - не работает. И даже в другую таблицу (с которой первая программа работает) не хочет записывать. Т.е. дело, я думаю :), не в таблице.


Johnmen   (2004-03-26 12:16:00) [13]

Ответственно скажу, что с
ADOQuery1.Parameters.ParamByName('parDateTime').Value:=<переменная типа TDateTime>;
где поле parDateTime типа datetime,
никаких проблем не наблюдается.


Jungle   (2004-03-26 12:09:00) [14]

Сервер точно MS SQL 2000

> и в чем дело? почему с правильной передачи параметров ушол?

Потому что не работало.
Единственный способ, который сработал в первой программе - это

ADOQuery1.Parameters.ParamValues['parDateTime'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', tmpDate);

Программа реально работает без ошибок.

Я его сразу во вторую прогу (обе мои) поэтому и воткнул. Когда не сработало - просто обалдел. Различия-то есть конечно. копался в Dfm-файлах, выставил во второй проге всё так же как в первой - всё равно не работает.
Уже вторую неделю извращаюсь. Вот уж сюда и полез, потому что совсем башка на эту тему больше не варит.


sniknik   (2004-03-26 11:15:00) [15]

и в чем дело? почему с правильной передачи параметров ушол?  

> А почему в одной программе работает, а вдругой - нет?
это твои программы? не можеш при наличии кода рассмотреть разницу? я как я ее рассмотрю без этого наличия?
могу только предположить, тип параметра не тот(или неопределен, тут и результат такой же). ставь явно до присвоения значения.

> Фиг-с-два. Пишет что-то вроде "приложение использует для данной операции значение неверного типа"
одно из двух, либо тип параметра не строка, либо сервер не MSSQL.


Jungle   (2004-03-26 10:54:00) [16]

> проблема в том что не поддежживается сервером преобразование даты из представленой строкой в ODBС

А почему в одной программе работает, а вдругой - нет?

> не преобразовывать
> ADOQuery1.Parameters.ParamValues['parDateTime']:= tmpDate;

Сначала так и было. Я всё перепробовал. С этой проблемой сталкиваюсь во второй раз. В первый раз нашёл в нете решение, которое в начальном посте.

> поменять формат строки на MSSQL стандарт

Фиг-с-два. Пишет что-то вроде "приложение использует для данной операции значение неверного типа"


sniknik   (2004-03-26 10:43:00) [17]

> Натолкните на мысль, уважаемые...
на какую? в чем проблема или как решить?

проблема в том что не поддежживается сервером преобразование даты из представленой строкой в ODBС стандарте. (почему хз. сам смотри, твой сервер)

решить, 2 варианта
хороший
не преобразовывать
ADOQuery1.Parameters.ParamValues['parDateTime']:= tmpDate;

плохой
поменять формат строки на MSSQL стандарт
ADOQuery1.Parameters.ParamValues['parDateTime'] := FormatDateTime('yyyymmdd hh:nn:ss', tmpDate)


Наверх

Титульная страница Поиск, карта сайта Написать письмо