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是空的,什么值也没有。不知为什么?

解决方案 »

  1.   

    在C#代码中将存储过程的输出参数保存在指定变量中再输出.
    cmd.parameters("@affectedRow")虽然名字和sql中的相同,但只有sql知道@affectedRow是什么,程序并不知道存储过程的返回值就是@affectedRow
      

  2.   

    if @@rowcount != 0 

     if @@rowcount > 0 
      

  3.   

    ALTER PROCEDURE [dbo].[cna_searchKey_insert]
    @keywords varchar(100),
    @tab char(1),
    @affectedRow int outputAS
    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 outputbegin
    --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 @strSQLEND
      

  4.   

    C#输出代码
    数据库返回值
    parameters[13].Direction = ParameterDirection.Output;
    scParameter.parameters = parameters;
    db.EditTableNoReturnValue(scParameter);
    return Convert.ToInt32(parameters[13].Value);