crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> вызов хранимок
svetlana
  опции профиля:
сообщение 5.11.2008, 14:32
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.10.2008
Из: Томск
Пользователь №: 390

Спасибо сказали: 0 раз(а)




Репутация:   2  


Помогите!!!
есть хранимки, которые добавляют в базу какую-нибудь сущность и возвращают id
например
ALTER PROCEDURE [dbo].[AddUser]
@FirstName        nvarchar(50),
@SurName        nvarchar(50),
@Patronymic        nvarchar(50),
@email            nvarchar(50),
@phone            nchar(11),
@Description    nvarchar(100),
@NicName        nvarchar(50),
@UserId            int -- Кто добавляет
AS
BEGIN
    declare @newid int,
            @ErrStr    nvarchar(250),
            @ret int
    if dbo.AdminValidating(@UserId)=0 and EXISTS (select id from Users where isAdmin=1)
        Begin
            set @ret=1
            Raiserror('У пользователя, от чьего имени производятся изменения, нет соответствующих прав',16,1)
        End
    else
        Begin
    declare @idTable table (id int)
    Begin try
        Begin Transaction AddUserTr;
        insert into dbo.Users
        (FirstName,SurName,Patronymic,email,phone,Description,Available,NicName)
        output INSERTED.id into @idTable
        values (@FirstName,@SurName,@Patronymic,@email,@phone,@Description,0,@NicName)
        Set @newid=(select Top 1 id from @idTable)
        insert into dbo.GeneralLog
        (TableName,ObjectId,UserId,actionDate,ActionType,Description,successfully)
        values ('users',@newid,@UserId,GetDate(),1,'',1)
        Commit Transaction AddUserTr;
        set @ret=@newid
    End try
    Begin Catch
        Rollback Transaction AddUserTr;
        set @ErrStr='Ошибка добавления записи '+(select ERROR_MESSAGE())
        insert into dbo.GeneralLog (TableName,ObjectId,UserId,actionDate,ActionType,Description,successfully)
        values ('users',@newid,@UserId,GetDate(),1,SubString(@ErrStr,0,100),0)
        set @ret=-1
        Raiserror(@ErrStr,16,1)
    End Catch
    End
    select @ret
    return @ret
END

и есть хранимка
ALTER PROCEDURE [dbo].[AddRelation]
@RelationName    nvarchar(50) , --Имя  маршрута
@FromNode         int,        --узел источник
@ToNode            int,    --узел назначение
@Status            nchar(2),    --Статус
@UserId            int -- Идентификатор пользователя (исполнителя)
AS
BEGIN
declare @idTable table (id int)
    declare    @ret int,
            @newid int,
            @ErrorString nvarchar(250)
    set @ErrorString ='Ошибка выполнения процедуры'
    if dbo.AdminValidating(@UserId)=0
        Begin
            set @ret=-1
            Raiserror('У пользователя, от чьего имени производятся изменения, нет соответствующих прав',16,1)
        End
    else
        Begin
            if NOT EXISTS (select id from dbo.Relations
            where RelationName=@RelationName and FromNode=@FromNode and ToNode=@ToNode)
                Begin
                    Begin try
                        Begin Transaction AddRelationTr;
                        insert into dbo.Relations (RelationName,FromNode,ToNode,Available,Status)
                        output INSERTED.id into @idTable
                        values (@RelationName,@FromNode,@ToNode,0,@Status)
                        set @newid=(select Top 1 id from @idTable)
                        insert into dbo.GeneralLog (TableName,ObjectId,UserId,actionDate,ActionType,Description,successfully)
                        values ('Relations',@newid,@UserId,GetDate(),1,'Запись добавлена',1)
                        Commit Transaction AddRelationTr;
                        set @ret=@newid
                        End try
                    Begin catch
                        Rollback Transaction AddRelationTr;
                        set @ErrorString =@ErrorString +' '+(select ERROR_MESSAGE())
                        insert into dbo.GeneralLog (TableName,ObjectId,UserId,actionDate,ActionType,Description,successfully)
                        values ('Relations',-1,@UserId,GetDate(),1,@ErrorString,0)
                        set @ret=-1
                        Raiserror(@ErrorString,16,1)
                    End catch
                End
            else
                Begin
                    insert into dbo.GeneralLog (TableName,ObjectId,UserId,actionDate,ActionType,Description,successfully)
                    values ('Relations',-1,@UserId,GetDate(),1,'Запись уже существует',0)
                    set @ret=-1
                    Raiserror('Запись уже существует',16,1)
                End
        End
    return @ret
END

вызываются они так

int cDataBase::AddRelation(cRelationData *data)
{
    int id = 0;
    QVariant res;
    QSqlQuery query(m_database);
    query.setForwardOnly(true);
    query.prepare("{CALL AddRelation(?, ?, ?, ?, ?)}");
    query.addBindValue(QVariant(data->m_name));
    query.addBindValue(QVariant(data->m_fromNodeID));
    query.addBindValue(QVariant(data->m_toNodeID));
    query.addBindValue(QVariant(data->m_status));
    query.addBindValue(QVariant(m_userID));
    if (!query.exec())
    {
        QMessageBox msgBox(QMessageBox::Warning, "Error",
            query.lastError().text(), QMessageBox::Ok);
        msgBox.exec();
        return id;
    }
    while (query.next())
    {
        id = query.value(0).toInt();
        data->m_ID = id;
    }
    return id;
}
первая хранимка работает нормально, и в результате получаю id
во втором случае в
while (query.next())
    {
        id = query.value(0).toInt();
        data->m_ID = id;
    }

даже не заходит....

в чем может быть проблема? и как ее решить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 15:16
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(svetlana @ 5.11.2008, 17:32) *
даже не заходит....

в чем может быть проблема? и как ее решить?
а ошибки при query.exec() не происходит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
svetlana
  опции профиля:
сообщение 5.11.2008, 15:25
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.10.2008
Из: Томск
Пользователь №: 390

Спасибо сказали: 0 раз(а)




Репутация:   2  


нет, ошибок нет..
хранимка выполняется, данные добавляются, а айдишник не приходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 15:43
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


чесно говоря не знаю что не так. Но я несколько иначе поступаю:
bool Controller::reinit()
{
  bool ok;
  QSqlDatabase    db = QSqlDatabase::database();
  
    ...
    QSqlQuery q(db);
    
    q.setForwardOnly(true);
    ok = q.exec("EXECUTE PROCEDURE P_GETDEVICES");

    qDebug() << "Query Ok?.............." << ok;
    if (!ok)
    {
        qDebug() << "Query Error............" << q.lastError();
        return ok;
    }
    ok = q.isActive();
    qDebug() << "Query isActive?........" << ok;
    if (!ok)
    {
        return ok;    
    }
    // курсор на первую позицию
    qDebug() << "Query first............" << q.first();
    
    while (q.isValid())
    {
        int itmp1, itmp2;
        itmp1 = q.value(0).toInt();
        itmp2 = q.value(1).toInt();
        ...
        q.next();
    }
    ...
    return true;
}


т.е. я пользуюсь QSqlQuery::first()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
svetlana
  опции профиля:
сообщение 5.11.2008, 16:08
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.10.2008
Из: Томск
Пользователь №: 390

Спасибо сказали: 0 раз(а)




Репутация:   2  


нашла загвозтку -
в конце перед
return @ret
надо поставить
select @ret

я в sql как-то не сильно разбираюсь, хранимки пишу не я... но видимо, это принципиально...///
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2008, 16:18
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


это что за СУБД? мелкософтная? (я в ней вообще по нулям)
помоему в FireBird синтаксис по проще выглядит:
SET TERM ^;
ALTER PROCEDURE P_GETDEVICES
RETURNS (
    PORT Integer,
    ADDR Integer )
AS
BEGIN
    /* список портов и адресов активных Т.У.*/
    FOR SELECT F_PORT, F_ADDR
        FROM POINTPROP
        WHERE (F_ON = '1')
    INTO :port, :addr
    DO
        SUSPEND;

END^
SET TERM; ^
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
svetlana
  опции профиля:
сообщение 5.11.2008, 17:03
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.10.2008
Из: Томск
Пользователь №: 390

Спасибо сказали: 0 раз(а)




Репутация:   2  


Microsoft SQL Server 2005
))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 22:34