На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Хранимая процедура , Все понятно но не получается...
    Знаю что тема уже забитая и нашел много примеров по работе с ХП, однако, никак не получется реализовать! Помагите найти ошибку плиз :( !
    ИТАК простая ХП на SQL Server 2000 c выходным параметром:
    ExpandedWrap disabled
       
      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 файл
    ExpandedWrap disabled
       
      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 файл
    ExpandedWrap disabled
       
      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
      }

    Вызываю:
    ExpandedWrap disabled
       
      RecordProcedure pro;
      pro.n_n=1;
      pro.Open(CRecordset::snapshot,"{?=CALL [Ginetic](?)}");
      int n=pro.n_n;


    Выдает сообщение:НЕПРАВИЛЬНОЕ ПОЛЕ COUNT ИЛИ ОШИБКА СИНТАКСИСА!

    В чем я ошибся? :wall:
      Во первых, я бы сделал так
      ExpandedWrap disabled
         
        CREATE PROCEDURE [Ginetic]
        @n  int
        AS
        BEGIN
        DECLARE @STR nvarchar(50)
        SET @STR=user
        if @STR='Operator' SELECT 1
          else   SELECT 2
        END
        GO

      И во вторых, наверное, так правильнее будет
      ExpandedWrap disabled
         
        pro.Open(CRecordset::snapshot,"{EXEC [Ginetic](?)}");
        Цитата

        И во вторых, наверное, так правильнее будет
        pro.Open(CRecordset::snapshot,"{EXEC [Ginetic](?)}");

        ну это врядли правильно!

        Хорошо я сделал запрос как предлагает GreenElf, при этом поменял:
        ExpandedWrap disabled
           
          void RecordProcedure::DoFieldExchange(CFieldExchange* pFX)
          {
              //{{AFX_FIELD_MAP(RecordProcedure)
              pFX->SetFieldType(CFieldExchange::inputParam);//сменил на инпут
              RFX_Long(pFX, _T("[@n]"), n_n);
           
              //}}AFX_FIELD_MAP
          }

        и
        ExpandedWrap disabled
           
          pro.Open(CRecordset::snapshot,"{CALL [Ginetic](?)}");


        Опять ошибка:"Ни один столбец не связан до вызова SQLFatchScroll/SQLExtendedFetch"

        Добавлено
        НЕ уж-то никто из присутствующих с БД не работает? :blink:
          Ой, блин, накосячил как обычно. Вот так надо было...имя полю присвоить забыл.
          ExpandedWrap disabled
             
            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 вызываются...насколько мои мозги помнят. Ну, да это не существенно.
            Все одно и тоже: "Ни один столбец не был связан до вызова SQLFatchScroll/SQLExtendedFetch" :'(
            Сообщение отредактировано: StavR -
              У тебя DoFieldExchange как определена? Покажи код, если можно.
                Что значит как определена? Код описан выше! <_<

                Так что ни у кого нет больше соображений :blink: ????
                  M
                  Тема перенесена из C/C++ -> Visual C++ / MFC / WTL / WinAPI
                    Сорри, ступнячил опять.
                    ТОгда где описание
                    CFieldParam::outputColumn и полей данных?
                    И еще: в конструкторе класса нужно корректно определить m_nFields
                    Примерно так:
                    ExpandedWrap disabled
                       
                      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 у меня не супер.

                    Да , и комментарии тоже...
                    Сообщение отредактировано: GreenElf -
                      Не совсем согласен что тема по SQL SErver 2000 так как проблема в реализации на С!!! ;)
                      НУ да ладно!

                      GreenElf ты полностью прав!
                      Цитата

                      ТОгда где описание
                      CFieldParam::outputColumn и полей данных?
                      И еще: в конструкторе класса нужно корректно определить m_nFields


                      дело в том что у меня процедура не возвращает полей данных m_nFields=0, в этом и ошибка!
                      Для этого случая надо сделать так:
                      ExpandedWrap disabled
                         
                        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 за правильное направление!!!
                      Сообщение отредактировано: StavR -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0699 ]   [ 15 queries used ]   [ Generated: 4.11.25, 19:33 GMT ]