日期:2014-05-17  浏览次数:20588 次

输出存储过程问题
存储过程
SQL code

USE [OperationData]
GO
/****** Object:  StoredProcedure [dbo].[Pro_UserMax]    Script Date: 09/28/2012 09:23:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[Pro_UserMax]
@maxNum int output
AS
  begin
  select @maxNum=MAX(Convert(int,PerNum)) from Sys_user
  end


在sql里边 exec ...执行得到的结果没错 是1004 也就是这个值应该是1004

但是在C#中 我取到的值 是2 这肯定不对

C#代码如下
C# code

try
{
       SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@maxNum",ParameterDirection.Output) };
       Convert.ToInt32(SQLHelper.ExecuteNonQuery(SQLHelper.sqlConnectionString, CommandType.StoredProcedure, "Pro_UserMax", parm));
    int Maxid = Convert.ToInt32(parm[0].Value);//现在maxid的值老是2
    return Maxid;
}
catch(Exception ex)
{
     throw ex;
}

//这是sqlhelp中的方法
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {

            SqlCommand cmd = new SqlCommand();

            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }

private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }




大家帮忙看下有什么错误...

------解决方案--------------------
访问的是同一个数据库么。。。
------解决方案--------------------
你跟踪下 执行存储过程的语句 得到那个 在SQL里面执行下 看得到的数值是多少?
貌似没看出错在哪里。。。
------解决方案--------------------
探讨
引用:

你跟踪下 执行存储过程的语句 得到那个 在SQL里面执行下 看得到的数值是多少?
貌似没看出错在哪里。。。


int val = cmd.ExecuteNonQuery();
到这里就是2 了

不知道怎么回事 在sql中 执行这个存储过程却是1004

------解决方案--------------------
new SqlParameter("@maxNum",ParameterDirection.Output)
这里 指定下数据类型 试试 
同时在看看连接字符串是不是指到你所要指的数据库。
------解决方案--------------------

SQLHelper.ExecuteNonQuery()的有些重载是可以得到存储过程返回值的。 
C# code

SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@maxNum",ParameterDirection.Output) };//这里再指定下数据类型
SQLHelper.ExecuteNonQuery(SQLHelper.sqlConnectionString, CommandType.StoredProcedure, "Pro_UserMax", parm);
int Maxid = Convert.ToInt32(parm[0].Value);
return Maxid;

------解决方案--------------------
在存储过程中加
return @maxNum
然后调用方法中加
"return",ParameterDirection.ReturnValue
把int Maxid = Convert.ToInt32(parm[0].Value改成
cmd.Parameters["return"].Value;