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的错误。请高手指点一下,是哪里出的问题。
查过资料,说是存储有问题,可是我用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的错误。请高手指点一下,是哪里出的问题。
存储过程的返回值,要新建一个参数去接收的。
你搜索下如何接收过程返回值就明白了。
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());
(
@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;
Sorry,那确实是多余的,忘删了。
Update [CheckCode] Set IsUsed=1 Where CheckCode = @checkcode--激活帐户
Update [Users] Set isLock=0 Where UserName = @UserName所需要的仅仅是获得受影响的行数就可以了,很郁闷的是,这个值始终是-1,我就闹不明白了。
{
s = "成功";
}
else
{
s = "失败" + u.ExecuteNonQuery();
}---------------------int ret = u.ExecuteNonQuery() ;
if (k > 0 )
{
s = "成功";
}
else
{
s = "失败";
}
if (ret > 0 )
{
s = "成功";
}
else
{
s = "失败";
}
请看 IF @t=0 --写入激活码
我是直接将那个参数赋值1了,为了让存储执行else后的内容
还是那个样子我还是列上表结构吧表名:ActiveCode列:
ID:自增长列,主键
CheckCode:nvarchar(max),可为空
UserName:nvarchar(max),可为空
isUsed:int,默认为0里头有数据,传入的参数都是表里存在的记录。
(1)如果通过查询分析器执行该存储过程,在显示栏中如果有影响的行数,则影响几行,count就是几
(2)如果通过查询分析器执行该存储过程,在显示栏中如果显示'命令已成功完成。'则count = -1;在显示栏中如果有查询结果,则count = -1
总结:A.ExecuteNonQuery()该方法只返回影响的行数,如果没有影响行数,则该方法的返回值只能是-1,不会为0。
B.不论ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text执行,其效果和A一样。你的存储过程没有显式的return语句,所有返回值就是上面说的
是否是由于我用select里有output,而update这没返回的。
导出表创建语句检查下
_with1.AddWithValue("@UserName", UserName);
_with1.AddWithValue("@checkcode", ActiveCode);
_with1.AddWithValue("@t",1);
if (u.ExecuteNonQuery() == 1)
{
s = "成功";
}
else
{
s = "失败" + u.ExecuteNonQuery();
} 这里错了,你去掉try{}cath{}funally{}然后运行,就看到错了
谢谢回答,我试过的,去掉了try也不报错原因就是2楼和20楼说的那样~
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 把简单的东西复杂化了...还闹出漏洞来....