powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQLBindParameter не хочет связывать дату
21 сообщений из 21, страница 1 из 1
SQLBindParameter не хочет связывать дату
    #32038565
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужна помощь людей.плотно юзающих SQL API

Я никак не могу правильно связать SQLBindParameter-ом какую-нибудь переменную датой ( пробовал DATE_STRUCT,CTime) ,хранящую дату, с маркером параметра (?) - функция SQLBindParameter дает код возврата -1.

Пробовал образец.выдранный из МСДН(в описании SQLBindParameter).-он не работает(т.е. работает на всех типах данных,кроме даты и времени)

Работаю из приложения VС++ на SQL Server2000 (через ОДВС 3.52)

Если есть пара строк кода, иллюстрирующих вышеизложенную проблему -пришлите, если не затруднит , на panza@mail.ru

С уважением Валерий
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #32058995
The Lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQLINTEGER LenOrInd;
SQL_TIMESTAMP_STRUCT Param;

SQLRETURN sqlRet = ::SQLBindParameter(hSTMT,
ParNum, // порядковый номер параметра в запросе - с 1
SQL_PARAM_INPUT,
SQL_C_TYPE_TIMESTAMP,
SQL_TIMESTAMP,
0,
0,
&Param,
0,
&LenOrInd);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
SQLBindParameter не хочет связывать дату
    #33421046
Алексей.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Возникла точно такая же проблема. Решение, подсказанное здесь на форуме, не помогло

код:

void Period()
{
CString str("{call aa(?)}");
SQL_TIMESTAMP_STRUCT param;
param.year = 2005;
param.month = 1;
param.day = 1;
param.day = 1;
param.hour = 4;
param.minute = 14;
param.second = 5;
param.fraction = 5;

SQLINTEGER LenOrInd;

SQLRETURN sqlRet = ::SQLBindParameter(hstmt,
1,
SQL_PARAM_INPUT_OUTPUT,
SQL_C_TYPE_TIMESTAMP,
SQL_TIMESTAMP,
0,
0,
&m,
0,
&LenOrInd);


RETCODE retcode = SQLExecDirect(hstmt, (UCHAR*)LPCTSTR(str), SQL_NTS);
if(retcode != SQL_SUCCESS)
PrintDatabaseError();
SQLFreeStmt(hstmt,SQL_CLOSE);
}


ALTER procedure aa
@date1 datetime OUTPUT
as
select @date1='5.5.2005'


результат выполнения - "[Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса"
в чем все-таки может быть проблема?
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33423670
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой тип у поля с датой в базе?
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33423852
Алексей.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_БалтикаКакой тип у поля с датой в базе?

если я правильно понял вопрос, то datetime.

выше я приводил код вызываемой процедуры
ALTER procedure aa
@date1 datetime OUTPUT
as
select @date1='5.5.2005'
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33425975
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей.в чем все-таки может быть проблема?
В непонимании принципа работы :)
SQLExecDirect() НЕ РАБОТАЕТ С ПАРАМЕТРАМИ.
Для работы с параметрами используется следующий набор команд:
Код: plaintext
1.
2.
SQLPrepare(hStmt, "call something(?)", SQL_NTS);
for (i= 1 ; i< count_of_parameters; i++) SQLBindParameter(...);
SQLExecute(hStmt);
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33448029
Aleксей.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
В непонимании принципа работы :)
SQLExecDirect() НЕ РАБОТАЕТ С ПАРАМЕТРАМИ.
Для работы с параметрами используется следующий набор команд:
Код: plaintext
1.
2.
SQLPrepare(hStmt, "call something(?)", SQL_NTS);
for (i= 1 ; i< count_of_parameters; i++) SQLBindParameter(...);
SQLExecute(hStmt);


В таком случае почему через тот же самый SQLExecDirect прекрасно отрабатывает следующее:

create procedure aa
@param int OUTPUT
as
select @param=@param+5
go

void Period()
{
CString str("{call aa(?)}");
int param = 5;
SQLRETURN sqlRet = ::SQLBindParameter(hstmt,1, SQL_PARAM_INPUT_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &m, 0, 0);

RETCODE retcode = SQLExecDirect(hstmt, (UCHAR*)LPCTSTR(str), SQL_NTS);
if(retcode != SQL_SUCCESS)
PrintDatabaseError();
SQLFreeStmt(hstmt,SQL_CLOSE);
}

и у меня проблема возникает ТОЛЬКО при использовании параметра типа datetime
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33448752
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подобная проблема была у меня с Ораклой. Переменные типа TIMESTAMP_STRUCT не биндились с полями базы типа TIMESTAMP зато все было отлично если в базе был тип DATE.
Простейший выход - передавать дату в строковом формате и затем конвертировать ее средствами базы. Хотя, скорее всего, ODBC драйвер сам сможет преобразовать.
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33450216
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleксей.В таком случае почему через тот же самый SQLExecDirect прекрасно отрабатывает следующее:
Потому что используемый драйвер ODBC не совсем соответствует ODBC стандарту :)

Aleксей.и у меня проблема возникает ТОЛЬКО при использовании параметра типа datetime
В описании твоего сервера и(или) поставляемых с ним ODBC драйверов должна быть табличка соотвествий типов в используемом SQL диалекте, ODBC и C типов данных.
А в MDAC почитай главу
Код: plaintext
1.
2.
3.
ODBC Programmer's Reference
   Developing Applications and Drivers
      Data Types in ODBC
          Data Type Conversions 
там написано какой тип данных присланый базой данных в какой примитивный С тип коневртируется самим ODBC и наоборот.
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33450272
Алексей.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_БалтикаПростейший выход - передавать дату в строковом формате и затем конвертировать ее средствами базы. Хотя, скорее всего, ODBC драйвер сам сможет преобразовать.

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

мне тоже пришлось использовать обходной путь что-то типа

create procedure aa
@d int output,
@m int output,
@y int output
as
declare @date datetime
select @date=convert(varchar(2),@m)+'.'+convert(varchar(2),@d)+'.'+convert(varchar(4),@y)
--
--
select @d=DATEPART(day,@date),@m=DATEPART(month,@date),@y=DATEPART(year,@date),
go

но лишнее преобразование - очень утомительно (когда их десятки) и это все-таки как-то через ж.... Да и, честно говоря, уже из принципа хочется перебороть ODBC. А вот силенок-то что-то не хватает! :o(
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33451438
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей.но лишнее преобразование - очень утомительно (когда их десятки) и это все-таки как-то через ж.... Да и, честно говоря, уже из принципа хочется перебороть ODBC. А вот силенок-то что-то не хватает! :o(

Естестественно через ж... Но что делать?... У меня уже возникала мысль самому дрова написать. :)
Незнаю как в SQL Server, в Оракле можно сделать так
to_char( <имя поля>, 'yyyy-mm-dd hh:mi:ss')
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33451473
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Балтика Алексей.но лишнее преобразование - очень утомительно (когда их десятки) и это все-таки как-то через ж.... Да и, честно говоря, уже из принципа хочется перебороть ODBC. А вот силенок-то что-то не хватает! :o(

Естестественно через ж... Но что делать?... У меня уже возникала мысль самому дрова написать. :)
Незнаю как в SQL Server, в Оракле можно сделать так
to_char( <имя поля>, 'yyyy-mm-dd hh:mi:ss')

Но это опять-же через ж
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #33511969
ounces
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно сделать проще и сложнее :)
Вначале сделать SELECT TOP 1 Col1, Col2, ... FROM Table с колонками, которые будут использоваться в настоящем запросе. Затем из получившегося курсора (result set-а) необходимые свойства колонок присвоить параметрам.
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34186774
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня частично получилось обойти через конверт в строку
но у меня специфичный случай - мне надо дружить ods и odbs
p.s.
форум постоянно не смотрю, просто борол проблему
на вопросы отвечу асей
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34186784
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimeanу меня частично получилось обойти через конверт в строку
но у меня специфичный случай - мне надо дружить ods и odbs
p.s.
форум постоянно не смотрю, просто борол проблему
на вопросы отвечу асей

??

думаю автору топику уже пофиг :)
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34186790
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аут!
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34187403
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> думаю автору топику уже пофиг :)

ну, я, скорее всего, не последний, ищущий SQLBindParameter + datetime :) хотя, конечно, чем дальше, тем меньше

раз уже страница удачно проиндексировалась поисковиком, то пусть кроме вариантов с sql_type_timestamp + sql_c_type_timestamp, который дает invalid time format (в моем конкретно случае, хотя это, подозреваю, тоже решаемо) или работы через другие типы (что у меня не получилось, но мне надо было править связку ods / odbc) останется и вариант конвертации через строку, как вполне рабочий обход проблемы
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34189767
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSQLExecDirect() НЕ РАБОТАЕТ С ПАРАМЕТРАМИ.


Сов, нагнал ты похоже.
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34189795
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я к тому, что Prepared execution и передача данных через параметры -- это вообще говоря никак не связанные друг с другом возможности. Как еще говорят, ортогональные.
Почему наличие или отсутствие одного должно исключать другое ?

Например, зачем вызывать хранимую процедуру через Prepared statement - совсем не понятно, на многих СУБД хранимая процедура и так подготовлена (ну ладно, скажем - для некоторых СУБД это бессмысленно). Но почему вследствие того, что я не хочу вызов подготавливать, я должен делать языковой запрос, а не RPC - не понятно.

Можно дать четкие ссылки на обоснующие это документы?
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34191365
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv White OwlSQLExecDirect() НЕ РАБОТАЕТ С ПАРАМЕТРАМИ.
Сов, нагнал ты похоже.И ты мне теперь будешь раз в месяц об этом напоминать?
Ну ладно, согласен, работает. Но неудобно это на мой взгляд. Потенциальная дырка для глюков.
Используя пару SQLPrepare/SQLExecute я всегда знаю что тут я работаю с повторяющейся SQL командой. А SQLExecDirect - с одноразовой командой. Биндить параметры для одноразовой команды можно, но слегка бессмысленно. Оно ж потом все равно на сервере повторно будет парситься.
...
Рейтинг: 0 / 0
SQLBindParameter не хочет связывать дату
    #34191778
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ ты мне теперь будешь раз в месяц об этом напоминать?

Да тут уж как хочешь
Хочешь - буду, хочешь - забуду ...

Превед кстате !
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQLBindParameter не хочет связывать дату
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]