есть хранимки, которые добавляют в базу какую-нибудь сущность и возвращают 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;
}
во втором случае в
while (query.next())
{
id = query.value(0).toInt();
data->m_ID = id;
}
даже не заходит....
в чем может быть проблема? и как ее решить?