c#调用存储总是返回-1,数据执行并未成功。
查过资料,说是存储有问题,可是我用Sql2005直接运行存储赋值,则是正常的,还是先看代码吧。存储代码(SQL2005)set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER PROCEDURE [dbo].[ActivedCode] 
(
@checkcode nvarchar(4000),
@UserName nvarchar(4000),
@t int
)
AS IF @t=0 --写入激活码
       
BEGIN
insert into [CheckCode] (UserName,CheckCode) Values ('' + @UserName + '',''+ @checkcode + '')
        END    ELSE --激活帐户 BEGIN --判断激活码是否已经使用了

declare @c int
declare @sqls nvarchar(4000)
set @sqls='select @a=Count(*) From [CheckCode] Where CheckCode =''' + @checkcode + ''' and isUsed=0'
exec sp_executesql @sqls,N'@a int output',@c output if @c=1
BEGIN --首先将激活码的状态改为已经使用
Update [CheckCode] Set IsUsed=1 Where CheckCode = @checkcode --激活帐户
Update [Users] Set isLock=0 Where UserName = @UserName
END
       
END

C#调用代码(为了检查代码是哪出的问题,我将代码改成下边的样子了)        //激活帐户
        public string ActivePassport(string UserName, string ActiveCode)
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = ConnectionString();
            string s;
            //s = false;
            try
            {
                conn.Open();
                DataSet ds = new DataSet();
                SqlCommand u = new SqlCommand();
                u.Connection = conn;
                u.CommandType = CommandType.Text;                u.CommandText = "ActivedCode";//调用存储过程
                u.Connection = conn;
                u.CommandType = CommandType.StoredProcedure;
                var _with1 = u.Parameters;
                _with1.AddWithValue("@UserName", UserName);
                _with1.AddWithValue("@checkcode", ActiveCode);
                _with1.AddWithValue("@t",1);
                if (u.ExecuteNonQuery() == 1)
                {
                    s = "成功";
                }
                else
                {
                    s = "失败" + u.ExecuteNonQuery();
                }            }
            catch(Exception ex)
            {
                s = "ok" + ex.Message ;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }            return s.ToString();
        }用SQL2005 Studio直接赋值时系统生成的代码
USE [91listenData]
GODECLARE @return_value intEXEC @return_value = [dbo].[ActivedCode]
@checkcode = N'13-68-FC-4F-99-E4-4C-8D-48-1F-C3-9B-7A-85-D9-96',
@UserName = N'91listen',
@t = 1SELECT 'Return Value' = @return_valueGO
问题就在于我用Sql Studio直接执行的时候是正常的,然而,我用上边的C#代码调用时,传递的值都是相同,类型也一样,唯独是c#代码报失败-1的错误。请高手指点一下,是哪里出的问题。

解决方案 »

  1.   

    catch(Exception ex)捕捉到的异常 完整信息是什么?
      

  2.   

    u.ExecuteNonQuery() == 1--这个只是SQL受影响的行数。
    存储过程的返回值,要新建一个参数去接收的。
    你搜索下如何接收过程返回值就明白了。
      

  3.   

    SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
    MyCommand.CommandType = CommandType.StoredProcedure;
    MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
    MyCommand.Parameters["@a"].Value = 10;
    MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
    MyCommand.Parameters["@b"].Value = 20;
    MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
    MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
    MyCommand.ExecuteNonQuery();
    Response.Write(MyCommand.Parameters["@return"].Value.ToString());
      

  4.   

    http://liuchuenyong.blog.163.com/blog/static/1128955320107241082291/
      

  5.   

    ALTER PROCEDURE [dbo].[ActivedCode] 
    (
        @checkcode nvarchar(4000),
        @UserName nvarchar(4000),
        @t int
    )
    AS
        SET NOCOUNT OFF--加入    
        IF @t=0 --写入激活码
      

  6.   

    加过Set NOCOUNT OFF了,一样的,没反应。
      

  7.   


    SqlCommand u = new SqlCommand();//这两行没有用了
    u.Connection = conn;
    u.CommandType = CommandType.Text;u.CommandText = "ActivedCode";//调用存储过程
    u.Connection = conn;
    u.CommandType = CommandType.StoredProcedure;
      

  8.   


    Sorry,那确实是多余的,忘删了。
      

  9.   

    你的存储过程没有输出类型的参数?最后加个: select @c 试一下
      

  10.   

    你存储过程里的参数  @t int 我怎么没有看到使用?
      

  11.   

    这么说吧,我写这个存储的目的并不是要返回值,而是执行下边的两句--首先将激活码的状态改为已经使用
    Update [CheckCode] Set IsUsed=1 Where CheckCode = @checkcode--激活帐户
    Update [Users] Set isLock=0 Where UserName = @UserName所需要的仅仅是获得受影响的行数就可以了,很郁闷的是,这个值始终是-1,我就闹不明白了。
      

  12.   

    if (u.ExecuteNonQuery() == 1)
                    {
                        s = "成功";
                    }
                    else
                    {
                        s = "失败" + u.ExecuteNonQuery();
                    }---------------------int ret = u.ExecuteNonQuery() ;
    if (k > 0 )
                    {
                        s = "成功";
                    }
                    else
                    {
                        s = "失败";
                    }
      

  13.   

    int ret = u.ExecuteNonQuery() ;
    if (ret > 0 )
      {
      s = "成功";
      }
      else
      {
      s = "失败";
      }
      

  14.   


    请看 IF @t=0 --写入激活码
    我是直接将那个参数赋值1了,为了让存储执行else后的内容
      

  15.   


    还是那个样子我还是列上表结构吧表名:ActiveCode列:
    ID:自增长列,主键
    CheckCode:nvarchar(max),可为空
    UserName:nvarchar(max),可为空
    isUsed:int,默认为0里头有数据,传入的参数都是表里存在的记录。
      

  16.   

    用方法 int count = cmd.ExecuteNonQuery()执行存储过程其返回值只有两种情况
     (1)如果通过查询分析器执行该存储过程,在显示栏中如果有影响的行数,则影响几行,count就是几
     (2)如果通过查询分析器执行该存储过程,在显示栏中如果显示'命令已成功完成。'则count = -1;在显示栏中如果有查询结果,则count = -1
    总结:A.ExecuteNonQuery()该方法只返回影响的行数,如果没有影响行数,则该方法的返回值只能是-1,不会为0。
          B.不论ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text执行,其效果和A一样。你的存储过程没有显式的return语句,所有返回值就是上面说的
      

  17.   

    select操作无错误返回的就是-1
      

  18.   

    可是我的操作是Update呢,并非select呢,select只是一个取判断值的。
      

  19.   


    是否是由于我用select里有output,而update这没返回的。
      

  20.   

    这是因为你的C#返回的是存储过程的结果,你的存储过程其实什么都没返回,update只是存储过程里面其中的一句,存储过程不会把它的处理结果返回给C#
      

  21.   

    有可能你表创建的时候某些开关设置不对,比如ANSI_PADDING是否被设置成off了
    导出表创建语句检查下
      

  22.   

    exec sp_executesql @sqls,N'@a int output',@c output@a int outpu参数未declare
      

  23.   

                    var _with1 = u.Parameters;
                    _with1.AddWithValue("@UserName", UserName);
                    _with1.AddWithValue("@checkcode", ActiveCode);
                    _with1.AddWithValue("@t",1);
                    if (u.ExecuteNonQuery() == 1)
                    {
                        s = "成功";
                    }
                    else
                    {
                        s = "失败" + u.ExecuteNonQuery();
                    } 这里错了,你去掉try{}cath{}funally{}然后运行,就看到错了
      

  24.   


    谢谢回答,我试过的,去掉了try也不报错原因就是2楼和20楼说的那样~
      

  25.   


    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER PROCEDURE [dbo].[ActivedCode] 
    (
        @checkcode nvarchar(4000),
        @UserName nvarchar(4000),
        @t int
    )
    AS    IF @t=0 --写入激活码
           
            BEGIN
                insert into [CheckCode] (UserName,CheckCode) Values (@UserName ,@checkcode)
            END    ELSE --激活帐户        BEGIN            --判断激活码是否已经使用了
                
                declare @c int
                select @c=Count(*) From [CheckCode] Where CheckCode = @checkcode  and isUsed=0
                if @c=1
                    BEGIN                    --首先将激活码的状态改为已经使用
                        Update [CheckCode] Set IsUsed=1 Where CheckCode = @checkcode                    --激活帐户
                        Update [Users] Set isLock=0 Where UserName = @UserName
                    END
           
            END
    这样就可以了..在存储过程里你还用字符串拼接和多余的exec sp_executesql 把简单的东西复杂化了...还闹出漏洞来....