![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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)