读书人

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

发布时间: 2013-01-23 10:44:50 作者: rapoo

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了
导出表创建语句检查下

读书人网 >SQL Server

热点推荐