Помогите!!!
есть хранимки, которые добавляют в базу какую-нибудь сущность и возвращают 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;
}
нет, ошибок нет..
хранимка выполняется, данные добавляются, а айдишник не приходит
чесно говоря не знаю что не так. Но я несколько иначе поступаю:
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;
}
нашла загвозтку -
в конце перед
return @ret
надо поставить
select @ret
я в sql как-то не сильно разбираюсь, хранимки пишу не я... но видимо, это принципиально...///
это что за СУБД? мелкософтная? (я в ней вообще по нулям)
помоему в 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; ^
Microsoft SQL Server 2005
))
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)