Хранимая процедура
, Все понятно но не получается...
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.5] |
|
|
информация о разделе
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Хранимая процедура
, Все понятно но не получается...
|
|
|
|
|
Знаю что тема уже забитая и нашел много примеров по работе с ХП, однако, никак не получется реализовать! Помагите найти ошибку плиз
!ИТАК простая ХП на SQL Server 2000 c выходным параметром: ![]() ![]() CREATE PROCEDURE [Ginetic] @n int OUTPUT AS DECLARE @STR nvarchar(50) SET @STR=user if @STR='Operator' set @n=1 else set @n=2 GO Подключаюсь через Recordset: .h файл ![]() ![]() class RecordProcedure : public CRecordset { public: RecordProcedure(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(RecordProcedure) // Field/Param Data //{{AFX_FIELD(RecordProcedure, CRecordset) long n_n; //}}AFX_FIELD ... .cpp файл ![]() ![]() RecordProcedure::RecordProcedure(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(RecordProcedure) n_n = 0; m_nFields = 0; //}}AFX_FIELD_INIT m_nParams = 1; m_nDefaultType = snapshot; } CString RecordProcedure::GetDefaultConnect() { return _T("ODBC;DSN=Generic"); } CString RecordProcedure::GetDefaultSQL() { return _T(""); } void RecordProcedure::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(RecordProcedure) pFX->SetFieldType(CFieldExchange::inoutParam); RFX_Long(pFX, _T("[@n]"), n_n); //}}AFX_FIELD_MAP } Вызываю: ![]() ![]() RecordProcedure pro; pro.n_n=1; pro.Open(CRecordset::snapshot,"{?=CALL [Ginetic](?)}"); int n=pro.n_n; Выдает сообщение:НЕПРАВИЛЬНОЕ ПОЛЕ COUNT ИЛИ ОШИБКА СИНТАКСИСА! В чем я ошибся? |
|
Сообщ.
#2
,
|
|
|
|
Во первых, я бы сделал так
![]() ![]() CREATE PROCEDURE [Ginetic] @n int AS BEGIN DECLARE @STR nvarchar(50) SET @STR=user if @STR='Operator' SELECT 1 else SELECT 2 END GO И во вторых, наверное, так правильнее будет ![]() ![]() pro.Open(CRecordset::snapshot,"{EXEC [Ginetic](?)}"); |
|
Сообщ.
#3
,
|
|
|
|
Цитата И во вторых, наверное, так правильнее будет pro.Open(CRecordset::snapshot,"{EXEC [Ginetic](?)}"); ну это врядли правильно! Хорошо я сделал запрос как предлагает GreenElf, при этом поменял: ![]() ![]() void RecordProcedure::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(RecordProcedure) pFX->SetFieldType(CFieldExchange::inputParam);//сменил на инпут RFX_Long(pFX, _T("[@n]"), n_n); //}}AFX_FIELD_MAP } и ![]() ![]() pro.Open(CRecordset::snapshot,"{CALL [Ginetic](?)}"); Опять ошибка:"Ни один столбец не связан до вызова SQLFatchScroll/SQLExtendedFetch" Добавлено НЕ уж-то никто из присутствующих с БД не работает? |
|
Сообщ.
#4
,
|
|
|
|
Ой, блин, накосячил как обычно. Вот так надо было...имя полю присвоить забыл.
![]() ![]() CREATE PROCEDURE [Ginetic] @n int AS BEGIN DECLARE @STR nvarchar(50) SET @STR=user if @STR='Operator' SELECT 1 AS Result else SELECT 2 AS Result END GO А вообще говоря, хранимки через EXEC вызываются...насколько мои мозги помнят. Ну, да это не существенно. |
|
Сообщ.
#5
,
|
|
|
|
Все одно и тоже: "Ни один столбец не был связан до вызова SQLFatchScroll/SQLExtendedFetch"
|
|
Сообщ.
#6
,
|
|
|
|
У тебя DoFieldExchange как определена? Покажи код, если можно.
|
|
Сообщ.
#7
,
|
|
|
|
Что значит как определена? Код описан выше!
Так что ни у кого нет больше соображений ???? |
|
Сообщ.
#8
,
|
|
|
|
M Тема перенесена из C/C++ -> Visual C++ / MFC / WTL / WinAPI |
|
Сообщ.
#9
,
|
|
|
|
Сорри, ступнячил опять.
ТОгда где описание CFieldParam::outputColumn и полей данных? И еще: в конструкторе класса нужно корректно определить m_nFields Примерно так: ![]() ![]() void RecordProcedure::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::inputParam);//сменил на инпут RFX_Long(pFX, _T("[@n]"), n_n); pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX, _T("Result"), m_nResult); } Извини, с MFC у меня не супер. Да , и комментарии тоже... |
|
|
|
|
|
Не совсем согласен что тема по SQL SErver 2000 так как проблема в реализации на С!!!
НУ да ладно! GreenElf ты полностью прав! Цитата ТОгда где описание CFieldParam::outputColumn и полей данных? И еще: в конструкторе класса нужно корректно определить m_nFields дело в том что у меня процедура не возвращает полей данных m_nFields=0, в этом и ошибка! Для этого случая надо сделать так: ![]() ![]() void StoredProcedure::Move( long nRows, WORD wFetchType ) { // Protection so that if the procedure returns no result sets, no // fetch operations are attempted. if (m_nFields) CRecordset::Move(nRows, wFetchType); else m_bBOF = m_bEOF = TRUE; } Извеняюсь что сразу не обратил на это внимания! GreenElf +1 за правильное направление!!! |