存储过程输出值问题
ALTER PROCEDURE [dbo].[cna_searchKey_insert]
@keywords varchar(100),
@tab char(1),
@affectedRow int output
AS
declare @strSQL nvarchar(1000)
BEGIN
set @strSQL = 'select tab from keywords where keywords = ' ' '+@keywords + ' ' ' '
exec sp_executesql @strSQL
set @affectedRow=@@rowcount
begin
if @@rowcount != 0
set @strSQL= 'update keywords set addtimes = addtimes + 1 where keywords = ' ' '+@keywords + ' ' ' '
else
set @strSQL= 'insert keywords (keywords,tab) values ( ' ' ' +@keywords+ ' ' ', ' ' '+@tab+ ' ' ') '
end
exec sp_executesql
END
我的意思是,往数据库里添加数据时,先判断这个数据是否存在,如果已经存在,那条记录的计数器+1,如果不存在就添加。
可是我在ASP里调用以上存储过程,发现response.write Cmd.Parameters( "@affectedRow ").Value是空的,什么值也没有。不知为什么?
------解决方案--------------------在C#代码中将存储过程的输出参数保存在指定变量中再输出.
cmd.parameters( "@affectedRow ")虽然名字和sql中的相同,但只有sql知道@affectedRow是什么,程序并不知道存储过程的返回值就是@affectedRow
------解决方案--------------------if @@rowcount != 0
改
if @@rowcount > 0
------解决方案--------------------ALTER PROCEDURE [dbo].[cna_searchKey_insert]
@keywords varchar(100),
@tab char(1),
@affectedRow int output
AS
declare @strSQL nvarchar(1000)
BEGIN
/*
set @strSQL = 'select tab from keywords where keywords = ' ' '+@keywords + ' ' ' '
exec sp_executesql @strSQL
set @affectedRow=@@rowcount
*/
set @strSQL = 'select @affectedRow=count(1) from keywords where keywords = ' ' '+@keywords + ' ' ' '
exec sp_executesql @strSQL,N '@affectedRow int output ',@affectedRow output
begin
--if @@rowcount != 0
if @affectedRow> 0
set @strSQL= 'update keywords set addtimes = addtimes + 1 where keywords = ' ' '+@keywords + ' ' ' '
else
set @strSQL= 'insert keywords (keywords,tab) values ( ' ' ' +@keywords+ ' ' ', ' ' '+@tab+ ' ' ') '
end
--exec sp_executesql
exec sp_executesql @strSQL
END
------解决方案--------------------C#输出代码
数据库返回值
parameters[13].Direction = ParameterDirection.Output;
scParameter.parameters = parameters;
db.EditTableNoReturnValue(scParameter);
return Convert.ToInt32(parameters[13].Value);