日期:2014-05-18  浏览次数:20476 次

存储过程输出值问题


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);