Хранимая процедура SQL Server через SOCI / ODBC в переполнении стека

Я использую SOCI библиотека программно взаимодействовать с БД SQL Server через ODBC. У меня проблемы с получением значений через выходные параметры в хранимых процедурах. Некоторый код (смоделированный после SOCI документация) …

/*
* create procedure
* Dan.soci_proc @id int, @name varchar(32) output
* as begin
* set nocount on;
* select @name = name from Dan.soci_test where id = @id
* end
*/
std::string sql = "Dan.soci_proc :id, :name";
std::string name;
int proc_ndx = 1;
soci::procedure proc = (my_soci.get_session().prepare << sql, soci::use(proc_ndx),
soci::use(name));
std::cout << "\nAttempting to execute stored procedure " << size << " times."<< std::endl;
for (; proc_ndx < adj_size; ++proc_ndx) {
try {
proc.execute();
while (proc.fetch())
std::cout << "Fetched: " << name << std::endl;
} catch (const soci::odbc_soci_error& e) {
std::cerr << "Error executing stored procedure." << std::endl;
std::cerr << e.what() << std::endl;
std::cerr << e.odbc_error_message() << std::endl;
return;
}
}

Мой код не выдает никаких ошибок или исключений, но ничего не получается. Я пытался назвать это по-разному (нормально exec синтаксис, ODBC call синтаксис и т. д.), но, похоже, ничего не работает. Мне интересно, если ошибка возвращается к это отсюда

Если параметр ввода / вывода опущен, или если указан литерал
для параметра драйвер сбрасывает выходное значение.

К сожалению, SOCI не поддерживает маркеры параметров, по крайней мере, насколько я могу судить.

Я заставил код работать с использованием этого вида синтаксиса …

std::string sql = "declare @name varchar(32); ""exec Dan.soci_proc :id, @name = @name output; select @name";
...
soci::procedure proc = (my_soci.get_session().prepare << sql, soci::use(proc_ndx),
soci::into(name));

Но это не идеально, по причинам, которые я считаю очевидными.

Кто-нибудь там использовал SOCI и имеет некоторый вклад в то, что мне нужно сделать по-другому, чтобы заставить это работать?

РЕДАКТИРОВАТЬ: я получил следующий ответ от форума / списка рассылки пользователей социальных сетей …

Я не использовал SOCI в течение нескольких лет, но я успешно получил
хранимые процедуры для работы с ODBC на SQL Server, конец 2011 г., соц.
версия 2 (я думаю).

Я помню, что для этого мне пришлось использовать утверждение, а не процедуру.

Мне пришлось изменить бэкэнд для вызова SQLMoreResults в цикле.

Выходные параметры, я думаю, не были поддержаны в SOCI, и я обработал
они напрямую с ODBC, над которым у меня также был слой C ++.

Однако, поскольку я недавно закончил колледж (только что начал свою первую работу в этом месяце!) И относительно неопытен в C ++ и приложениях баз данных, я был бы очень признателен за помощь, которую могут предложить люди! Например, в отношении вышеуказанного ответа — последние два пункта мне не совсем понятны.

1

Решение

Проблема в том, что я использовал ODBC SOCI, который, очевидно, не поддерживает хранимые процедуры.

За несколько месяцев, с тех пор как я изначально задавал этот вопрос, я реализовал свой собственный бэкэнд SOCI, для которого хранимые процедуры работают отлично!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]