首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

c#调用存储过程的返回值老是-1

2013-01-23 
c#调用存储过程的返回值总是-1c#调用存储总是返回-1,数据执行并未成功。查过资料,说是存储有问题,可是我用S

c#调用存储过程的返回值总是-1
c#调用存储总是返回-1,数据执行并未成功。
查过资料,说是存储有问题,可是我用Sql2005直接运行存储赋值,则是正常的,还是先看代码吧。

存储代码(SQL2005)


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER 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]
GO

DECLARE@return_value int

EXEC@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 = 1

SELECT'Return Value' = @return_value

GO


问题就在于我用Sql Studio直接执行的时候是正常的,然而,我用上边的C#代码调用时,传递的值都是相同,类型也一样,唯独是c#代码报失败-1的错误。请高手指点一下,是哪里出的问题。
[解决办法]
catch(Exception ex)捕捉到的异常 完整信息是什么?
[解决办法]
u.ExecuteNonQuery() == 1--这个只是SQL受影响的行数。
存储过程的返回值,要新建一个参数去接收的。
你搜索下如何接收过程返回值就明白了。
[解决办法]
ALTER PROCEDURE [dbo].[ActivedCode] 
(
    @checkcode nvarchar(4000),
    @UserName nvarchar(4000),
    @t int
)
AS
    SET NOCOUNT OFF--加入    
    IF @t=0 --写入激活码

[解决办法]

SqlCommand u = new SqlCommand();

//这两行没有用了
u.Connection = conn;
u.CommandType = CommandType.Text;


u.CommandText = "ActivedCode";//调用存储过程
u.Connection = conn;
u.CommandType = CommandType.StoredProcedure;


[解决办法]
你的存储过程没有输出类型的参数?

最后加个: select @c 试一下
[解决办法]
if (u.ExecuteNonQuery() == 1)
                {
                    s = "成功";
                }
                else
                {
                    s = "失败" + u.ExecuteNonQuery();
                }

---------------------

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

[解决办法]
int ret = u.ExecuteNonQuery() ;
if (ret > 0 )
  {
  s = "成功";
  }
  else
  {
  s = "失败";
  }

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

你的存储过程没有显式的return语句,所有返回值就是上面说的
[解决办法]
select操作无错误返回的就是-1
[解决办法]
这是因为你的C#返回的是存储过程的结果,你的存储过程其实什么都没返回,update只是存储过程里面其中的一句,存储过程不会把它的处理结果返回给C#
[解决办法]
其实存储过程的强项在于计算及表关联的处理,象这样简单的处理过程,其实放前端写更好。这也是一个N层结构,业务层放哪的一个争论了,呵呵。
[解决办法]
有可能你表创建的时候某些开关设置不对,比如ANSI_PADDING是否被设置成off了
导出表创建语句检查下

热点排行