|
Помогите!!! есть хранимки, которые добавляют в базу какую-нибудь сущность и возвращают 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; }
даже не заходит....
в чем может быть проблема? и как ее решить? |