Здравствуйте! Пишу консольное приложение C++ - IBPP - Firebird 1.5.
Не могу заставить работать следующий код:
IBPP::Statement st = IBPP::StatementFactory(db, tr);
st->Prepare("execute procedure INSERT_TRIPLET( ?, ?, ?)");
st->Set(1,"aaa");
st->Set(2,"bbb");
st->Set(3,"ccc");
st->Execute();
Хранимая процедура не возвращает параметры. Входные параметры - VARCHAR.
Вылетает exception о том, что нельзя сделать такой prepare.
Пытался писать :a, :b, :c - не работает.
Когда явно пишу
st->Prepare("execute procedure INSERT_TRIPLET( 'aaa', 'bbb', 'ccc')");
работает.
Единственное предположение - что для execute procedure нельзя делать prepare с параметраметрами !??
Помогите пожалуйста разобраться!
Prepare Execute Procedure в IBPP
Модератор: kdv
Точнее даже не так, когда делаю
st->Set(1,"aaa");
все работает, а вот когда пытаюсь в качестве параметра передать std::string, которая изменяется в цикле и в том же цикле же выполниять
st->Execute();
- не работает.
Я понимаю, что в объявлении Set явно написано, что параметр должен быть типа const std::string &, что подразумевает, что строка не должна изменяться. Но встает логичный вопрос: почему после Execute ее нельзя изменять?
Может кто знает, как это обойти? Можно конечно явно изменениять текст statement... Но это как-то уж слишком
st->Set(1,"aaa");
все работает, а вот когда пытаюсь в качестве параметра передать std::string, которая изменяется в цикле и в том же цикле же выполниять
st->Execute();
- не работает.
Я понимаю, что в объявлении Set явно написано, что параметр должен быть типа const std::string &, что подразумевает, что строка не должна изменяться. Но встает логичный вопрос: почему после Execute ее нельзя изменять?
Может кто знает, как это обойти? Можно конечно явно изменениять текст statement... Но это как-то уж слишком

а там что, нет возможности явно присвоить параметр соответственно типу?
как у TParam - asInteger, asString?
Всегда приводи ТОЧНОЕ и ПОЛНОЕ сообщение об ошибке. Может это вообще ошибка не сервера, а IBPP.
как у TParam - asInteger, asString?
не надо заниматься вольным переводом сообщений об ошибках. Их общее число около 4-х тысяч, поэтому даже люди семи пядей во лбу не помнят все абсолютно точно.Вылетает exception о том, что нельзя сделать такой prepare.
Всегда приводи ТОЧНОЕ и ПОЛНОЕ сообщение об ошибке. Может это вообще ошибка не сервера, а IBPP.
Не очень понял, что это значит?..kdv писал(а):а там что, нет возможности явно присвоить параметр соответственно типу?
К сожалению полное сообщение об ошибке мало что даст в данном случае:
-----------------------------------------------------------
Project hmmconsole.exe raised exception class ibpp_internals::SQLExceptionImpl with message 'Exception Object Address: 0xCCC636'.
-----------------------------------------------------------
Написал маленькую тестовую программку, в ней то, что до этого не работало, работает.
А может такое быть, что английские буквы записываются, а русские в dos866, если в базе поле тоже имеет кодировку dos866 ?
Да, действительно ошибка была в том, что IBPP не может вызвать Execute Procedure если в качестве параметров хранимой процедуры передавать строки в кодировке DOS866. Не знаю - может быть это у меня так по дурацки все настроено. Для базы стоит кодировка по умолчанию WIN1251, у полей тип сменил (изначально win1251) на DOS866. Потом пытался вызывать хранимую процедуру со строковыми (VARCHAR) параметрами в кодировке dos866 (в клиетском приложении обрабатывается файл в такой кодировке). В результате имеем ошибку!!!