我的调用存贮过程的代码错在哪呢?请大家帮看一下?
第一次学着写c#调用存贮过程,就是报错,我无计可施了,错在哪里呢?
存贮过程的参数如下:
ALTER    proc gjj_公积金查询
@yuefen_begin varchar(6),
@yuefen_end varchar(6),
@flag_mxhj int =0 , -- 0-按合计查询,1-按明细查询
@flag_drbj int =0 , -- 0-查全部,1-只查工资导入的,2-只查手工录入的
@strmsg varchar(100)='' output
as 
我的c#代码如下:namespace gongjijin
{
    class clsgjj
    {
        //private SqlDataReader dataReader = null;            //dataRader  对象
        private SqlCommand command = null;                  //命令对象
        private DataSet MyDataSet = null;                   //dataset对象
        private SqlDataAdapter MyDataAdapter = null;        //dataadapter对象
        private string progName = "";
        clsdb mydb;
        //private string strsql;        //登录类初始化(将全局连接对象传进来)
        public void clsgjjInit()
        {
            mydb = clsdb.Instance();
            command = new SqlCommand();
            command.Connection = mydb.conn;
            MyDataSet = new DataSet();
        }        //通过存贮过程,查询公积金
        public int Getgjj(string yfBegin,string yfEnd,int iFlagHj,int iFlagFilter)
        {
            progName ="gjj_公积金查询";    //存贮过程名称            command = new SqlCommand();
            command.Connection = mydb.conn;            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = progName;            command.Parameters.Add(new SqlParameter("@yuefen_begin", SqlDbType.VarChar.ToString()));
            command.Parameters["@yuefen_begin"].Value = yfBegin;            command.Parameters.Add(new SqlParameter("@yuefen_end", SqlDbType.VarChar.ToString()));
            command.Parameters["@yuefen_end"].Value = yfEnd;            command.Parameters.Add(new SqlParameter("@flag_mxhj", SqlDbType.Int));
            command.Parameters["@flag_mxhj"].Value = iFlagHj;            command.Parameters.Add(new SqlParameter("@flag_drbj", SqlDbType.Int));
            command.Parameters["@flag_drbj"].Value = iFlagFilter;            command.Parameters.Add(new SqlParameter("@strmsg", SqlDbType.VarChar.ToString()));
            command.Parameters["@strmsg"].Direction = ParameterDirection.Output;            command.ExecuteNonQuery();
            MyDataAdapter.SelectCommand = command;
            //if (MyDataSet != null)
            //{
            //    MyDataAdapter.Fill(MyDataSet, "table");
            //}            //DataGrid1.DataSource = MyDataSet;
            //DataGrid1.DataBind();            MessageBox.Show(command.Parameters["@strmsg"].Value.ToString());            return 0;
        }
    }
}
执行到以下两句就执行不下去了
command.ExecuteNonQuery();
MyDataAdapter.SelectCommand = command;

解决方案 »

  1.   

    根据我的观察数据连接对象(conn)好你没有调用open()方法command对象不需要执行ExecuteNonQuery(),要得数据(结果集)应该由他的包装对象adapter去执行fill 方法
    以下是我写的一点小片断应该对你有用try
                {
                    DataSet ds = new DataSet();
                    SqlCommand comm = new SqlCommand(tranName,conn);
                    comm.Parameters.AddRange(paras);
                    conn.Open();
                    comm.CommandType = CommandType.StoredProcedure;
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = comm;
                    adapter.Fill(ds);
                    return ds.Tables[0];
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    conn.Close();
                }
      

  2.   

    不好意思下面是完整方法        public static DataTable GetTableByProc(string tranName,SqlParameter[] paras)
            {
                try
                {
                    DataSet ds = new DataSet();
                    SqlCommand comm = new SqlCommand(tranName,conn);
                    comm.Parameters.AddRange(paras);
                    conn.Open();
                    comm.CommandType = CommandType.StoredProcedure;
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = comm;
                    adapter.Fill(ds);
                    return ds.Tables[0];
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    conn.Close();
                }        }
      

  3.   

    根据我的观察数据连接对象(conn)好你没有调用open()方法'
    -----------------------------------------------------------
    不是的,这个肯定连接了。我是通过类clsdb进行连接的。
    clsdb 是一个长连接的数据库类,启动程序后就是长连接。command的连接就是 clsdb.conn,
    conn是clsdb 类中的 sqlconnection 对象。
      

  4.   

                progName ="gjj_公积金查询";    //存贮过程名称            command = new SqlCommand();
                command.Connection = mydb.conn;            command.CommandType = CommandType.StoredProcedure;
                command.CommandText = progName;
    以上代码对吗?这是我怀疑的地方,因为好多代码都不是这样的,
    而是:
    SqlCommand comm = new SqlCommand(tranName,conn);我不知我的写法对不对,现在没有环境,也试不出来。
      

  5.   

    参数定义的不对,试试:
    command.Parameters.Add(new SqlParameter("@yuefen_begin", SqlDbType.VarChar ,6));
                command.Parameters["@yuefen_begin"].Value = yfBegin;            command.Parameters.Add(new SqlParameter("@yuefen_end", SqlDbType.VarChar,6));
                command.Parameters["@yuefen_end"].Value = yfEnd;            command.Parameters.Add(new SqlParameter("@flag_mxhj", SqlDbType.Int));
                command.Parameters["@flag_mxhj"].Value = iFlagHj;            command.Parameters.Add(new SqlParameter("@flag_drbj", SqlDbType.Int));
                command.Parameters["@flag_drbj"].Value = iFlagFilter;            command.Parameters.Add(new SqlParameter("@strmsg", SqlDbType.VarChar,100));
                command.Parameters["@strmsg"].Direction = ParameterDirection.Output;            command.ExecuteNonQuery();
      

  6.   

    command.Parameters.Add(new SqlParameter("@yuefen_begin", SqlDbType.VarChar.ToString()));
    怎么会想起来ToString呢?!╮(╯▽╰)╭