如何调用ExecuteNonQuery()返回存储过程的值

fjxmzsl 2016-02-02 02:21:01
我每次调用存储过程都能够正常执行,但count返回的值都是-1。我想达到的效果是:返回为1。

代码如下:

int count = DataBaseHelper.ExcuteSqlReturnInt("zsl_InsertAddressBook", CommandType.StoredProcedure, pars);
if (count > 0)
{
return true;
}
else
{
return false;
}





public static int ExcuteSqlReturnInt(string cmdText, CommandType type, params SqlParameter[] pars)
{

SqlConnection conn = new SqlConnection(ConnString);
try
{

if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
{
conn.Open();
}

SqlCommand sqlcommand = new SqlCommand(cmdText, conn);


if (pars != null && pars.Length > 0)
{
foreach (SqlParameter p in pars)
{
sqlcommand.Parameters.Add(p);
}

}



sqlcommand.CommandType = type;

int count = sqlcommand.ExecuteNonQuery();

return count;
}
catch (Exception ex)
{
return 0;
}
finally
{

conn.Close();
}


}





CREATE PROCEDURE [dbo].[zsl_InsertAddressBook]
@fldName nvarchar(1000), @fldValue nvarchar(2000), @tbName nvarchar(255), @lenGroupID nvarchar(50)
WITH EXEC AS CALLER
AS
Set nocount on

declare @collen int;
declare @colgroup varchar(5);

set @collen=len(@lenGroupID);
set @colgroup= convert(varchar(5),@collen);

if @collen=6
begin
set @fldname =@fldName+' ,Group6'+' ,Group4';
set @fldValue=@fldValue+','+''''+@lenGroupID+''''+','+''''+substring(@lenGroupID,1,4)+'''';
end

if @collen=8
begin
set @fldname =@fldName+' ,Group8'+' ,Group6'+' ,Group4';
set @fldValue=@fldValue+','+''''+@lenGroupID+''''+','+''''+substring(@lenGroupID,1,6)+''''+','+''''+substring(@lenGroupID,1,4)+'''';
end

if @collen=10
begin
set @fldname =@fldName+' ,Group10'+' ,Group8'+' ,Group6'+' ,Group4';
set @fldValue=@fldValue+','+''''+@lenGroupID+''''+','+''''+substring(@lenGroupID,1,8)+''''+','+''''+substring(@lenGroupID,1,6)+''''+','+''''+substring(@lenGroupID,1,4)+'''';
end

begin
Declare @strSQL varchar(4000);
Set @strSQL='Insert into '+@tbName+' ('+@fldname +') values('+@fldValue +')';
exec (@strSQL);
end
...全文
347 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjxmzsl 2016-02-04
  • 打赏
  • 举报
回复
唉。水平太低了,有更容易懂的代码吗?研究了1-2天还是不明白。
fjxmzsl 2016-02-03
  • 打赏
  • 举报
回复
我真笨,研究了一天,还是搞不懂。唉。。。。
引用 4 楼 qbilbo 的回复:
ExecuteNonQuery 返回的是最后一条SQL语句影响的行数。 如果你想得到存储过程中的Return,那存储过程中,你必须写Return 0或Return 1。 Return 只能是int 另外还有输出参数,可以是任意类型。 概念别搞混了。 假设有存储过程如下:
CREATE PROCEDURE [dbo].[sp_add]
(
	@x int,
	@y int,
	@r int output
)
AS
BEGIN
	SET NOCOUNT ON;

	set @r =  @x + @y;
	
	return 0;
END
调用方式:
using (SqlConnection conn = new SqlConnection())
{
                conn.ConnectionString = xxxx;
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "sp_add";
                    SqlParameter[] ps = new SqlParameter[4];
                    ps[0] = new SqlParameter("@x", 1);
                    ps[1] = new SqlParameter("@y", 2);
                    ps[2] = new SqlParameter("@r", SqlDbType.Int);
                    ps[2].Direction = ParameterDirection.Output;
                    ps[3] = new SqlParameter();
                    ps[3].SqlDbType = SqlDbType.Int;
                    ps[3].Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.AddRange(ps);
                    int r = cmd.ExecuteNonQuery();

                    Console.WriteLine(string.Format("@r={0},存储过程返回:{1},ExecuteNonQuery返回:{2}", ps[2].Value, ps[3].Value, r));
                }
 }
看一下都返回了此什么。
fjxmzsl 2016-02-03
  • 打赏
  • 举报
回复
百度了下,用exec (@strSQL);语句,等到的结果确实是-1
引用 6 楼 From_TaiWan 的回复:
你的存储过程,就是插入数据,只要成功插入,一定不会是-1的,是不是插入失败,或者哪里的语句不对
秋的红果实 2016-02-02
  • 打赏
  • 举报
回复
你的存储过程,就是插入数据,只要成功插入,一定不会是-1的,是不是插入失败,或者哪里的语句不对
拜一刀 2016-02-02
  • 打赏
  • 举报
回复
存储过程里得有个返回值类型的吧,添加一个对应的parameter ,然后 search.Parameters.Add("@id", SqlDbType.Int) search.Parameters("@id").Direction = ParameterDirection.ReturnValue 这样再ExecuteNonQuery()之后 Dim id As String = search.Parameters("@id").Value.ToString(我这是vb.net的),id就是对应的返回的值了
qbilbo 2016-02-02
  • 打赏
  • 举报
回复
ExecuteNonQuery 返回的是最后一条SQL语句影响的行数。 如果你想得到存储过程中的Return,那存储过程中,你必须写Return 0或Return 1。 Return 只能是int 另外还有输出参数,可以是任意类型。 概念别搞混了。 假设有存储过程如下:
CREATE PROCEDURE [dbo].[sp_add]
(
	@x int,
	@y int,
	@r int output
)
AS
BEGIN
	SET NOCOUNT ON;

	set @r =  @x + @y;
	
	return 0;
END
调用方式:
using (SqlConnection conn = new SqlConnection())
{
                conn.ConnectionString = xxxx;
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "sp_add";
                    SqlParameter[] ps = new SqlParameter[4];
                    ps[0] = new SqlParameter("@x", 1);
                    ps[1] = new SqlParameter("@y", 2);
                    ps[2] = new SqlParameter("@r", SqlDbType.Int);
                    ps[2].Direction = ParameterDirection.Output;
                    ps[3] = new SqlParameter();
                    ps[3].SqlDbType = SqlDbType.Int;
                    ps[3].Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.AddRange(ps);
                    int r = cmd.ExecuteNonQuery();

                    Console.WriteLine(string.Format("@r={0},存储过程返回:{1},ExecuteNonQuery返回:{2}", ps[2].Value, ps[3].Value, r));
                }
 }
看一下都返回了此什么。
fjxmzsl 2016-02-02
  • 打赏
  • 举报
回复
不明白怎么传。 public bool CommInsertTable(string tbName, string fldName, string fldValue, string lenGroupID) { SqlParameter[] pars = new SqlParameter[]{ new SqlParameter("@tbName",tbName), new SqlParameter("@fldName",fldName), new SqlParameter("@fldValue",fldValue), new SqlParameter("@lenGroupID",lenGroupID) }; int count = DataBaseHelper.ExcuteSqlReturnInt("zsl_InsertAddressBook", CommandType.StoredProcedure, pars); if (count > 0) { return true; } else { return false; } }
引用 2 楼 evionmzs 的回复:
执行executeNonquery()后, 取输出参数的值 cmd.Paramters["@pa"].value
马少华 2016-02-02
  • 打赏
  • 举报
回复
执行executeNonquery()后, 取输出参数的值 cmd.Paramters["@pa"].value
  • 打赏
  • 举报
回复
你没传入commandType是存储过程啊

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧