如有以下存储过程:
CREATE PROCEDURE t1
@tt int  output
 AS
set @tt=20
GO
我想在c#代码中写出@tt的值,代码如下:        SqlConnection con = new SqlConnection("server=;database=nursinghomes;uid=sa;pwd=;");
        SqlCommand cmd = new SqlCommand("t1",con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@tt",DbType.Int32));
        cmd.Parameters["@tt"].Direction = ParameterDirection.Output;
        con.Open();
        cmd.ExecuteNonQuery();
        Response.Write(cmd.Parameters["@tt"].Value.ToString());
但写出来的是空值,请问应该如果写??

解决方案 »

  1.   

    如有以下存储过程: 
    CREATE PROCEDURE t1 
    @tt int  output 
     AS 
    set @tt=20 
    GO --------------------没输出嘛,怎么有返回值.
      

  2.   

    C#不会,
    MSSQL中:
    exec t1 @t output
      

  3.   

    D. 使用 OUTPUT 参数
    OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。首先,创建过程:USE pubs
    GO
    IF EXISTS(SELECT name FROM sysobjects
          WHERE name = 'titles_sum' AND type = 'P')
       DROP PROCEDURE titles_sum
    GO
    USE pubs
    GO
    CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
    AS
    SELECT 'Title Name' = title
    FROM titles 
    WHERE title LIKE @@TITLE 
    SELECT @@SUM = SUM(price)
    FROM titles
    WHERE title LIKE @@TITLE
    GO接下来,将该 OUTPUT 参数用于控制流语言。 说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。
    参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。 DECLARE @@TOTALCOST money
    EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
    IF @@TOTALCOST < 200 
    BEGIN
       PRINT ' '
       PRINT 'All of these titles can be purchased for less than $200.'
    END
    ELSE
       SELECT 'The total cost of these titles is $' 
             + RTRIM(CAST(@@TOTALCOST AS varchar(20)))下面是结果集:Title Name                                                               
    ------------------------------------------------------------------------ 
    The Busy Executive's Database Guide
    The Gourmet Microwave
    The Psychology of Computer Cooking(3 row(s) affected)Warning, null value eliminated from aggregate.
     
    All of these titles can be purchased for less than $200.
      

  4.   

    CREATE PROCEDURE t1 @tt int  output  
    AS  
      set @tt=20  
    GOdeclare @tt as int
    exec t1 @tt OUTPUT
    print 'result =' + cast(@tt as varchar)drop procedure t1  /*
    result =20
    */
      

  5.   

    我改了改程序
    存储过程:
    CREATE PROCEDURE t1
    @tt int  output
     AS
    set @tt=@tt+1
    GOc#代码:
    SqlConnection con = new SqlConnection("server=;database=nursinghomes;uid=sa;pwd=;");
            SqlCommand cmd = new SqlCommand("t1",con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@tt",20));
            cmd.Parameters["@tt"].Direction = ParameterDirection.Output;
            con.Open();
            cmd.ExecuteNonQuery();
            Response.Write(cmd.Parameters["@tt"].Value.ToString());
    但还是写空值
    我的目的是想在c#里调用存储过程里面的@tt的值,理论上response出来的应该是21吧,但还是写空值
      

  6.   

    谢谢楼上的各位,在sql我知道怎样做,我现在要的是在C#调用@tt并显示他的结果,不知道有没有方法!
      

  7.   

    如果是sql server,就看看二楼和四楼的方法.如果是C#,你到那个版中去问,毕竟这里会C#的人不多.
      

  8.   

    大哥你
          cmd.Parameters.Add(new SqlParameter("@tt",20)); 
    和這個
    CREATE PROCEDURE t1 
    @tt int  output 
     AS 
    set @tt=@tt+1 
    GO 
    仔細看看,你沒有輸入數值﹐肯定是空啊﹗建議存儲過程定義輸入參數﹕
    CREATE PROCEDURE t1 
    @t int﹐ @tt int  output 
     AS 
    set @tt=@t+1 
    GO 

     cmd.Parameters.Add(new SqlParameter("@t",20)); 
    這樣試下
      

  9.   

    你是輸出哦,如果你
    cmd.Parameters.Add(new SqlParameter("@tt",20));  
    是輸入.肯定沒數值.
      

  10.   

    cmd.Parameters.Add(new SqlParameter("@tt",20)); 
            cmd.Parameters["@tt"].Direction = ParameterDirection.Output; 
    这里已经设置了输出类型呀,理论上应该有输出的吧,我试试你的方法,谢谢
      

  11.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  12.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  13.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  14.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  15.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex
      

  16.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  17.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  18.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?set @recordCount=(select  count(*) from @tb) order by @keyindex第一问题已从niming520那里结合下面的那句得到答案了
     cmd.Parameters["@tt"].Direction = ParameterDirection.Output;  
    谢谢niming520
      

  19.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4)); 
    dmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  20.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4)); 
    dmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  21.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4)); 
    dmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  22.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4)); 
    dmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  23.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀? set @recordCount=(select  count(*) from @tb) order by @keyindex
      

  24.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4));  
    cmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  25.   

    cmd.Parameters.Add(new SqlParameter("@tt",SqlDbType.Int,4));  
    cmd.Parameters[0].Direction = ParameterDirection.Output;随手敲的,可能手误.
      

  26.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀? set @recordCount=(select  count(*) from @tb) order by @keyindex
      

  27.   

    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀? set @recordCount=(select  count(*) from @tb) order by @keyindex
      

  28.   

    多谢谢niming 1982的方法,问题已解决~~
      

  29.   

    29楼的问题,跟这个一样,我就不重打了,你自己看一下下面连接中我在5楼和8楼的回贴.http://topic.csdn.net/u/20080313/11/9914a30c-a8dc-475c-8f8e-eaee4ae404f4.html你的@tb 和@keyindex 都是字串, 不是数据库对象.需要使用动态语句.
      

  30.   


    补充一问题,解决散分,下面那句出错在那里呀,说@tb必须声明,PS:@recordCount,@tb,@keyindex在存储过程中已经声明,是不是select count(*)不能带变量呀?  set @recordCount=(select  count(*) from @tb) order by @keyindex
    -------------------------
    ---这个需要改为:declare @sql nvarchar(100)
    declare @recordCount int
    set @sql='select @count=count(*) from '+ @tb + ' order by '+@keyindex
    exec sp_executesql @sql,N'@count int output',@recordCount output
      

  31.   

    上面的“sp_executesql”这个怎么不变颜色噢?奇怪
      

  32.   

    cmd.Parameters["@tt"].Value = 20;这句话没写