刚才问了个数据库连接的 现在请教一个读取类的:
如:namespace BProc
{
  public DataSet Re_DataSet(string strProName, ProceducreParameter[] stProParameters)
        {
            using (B_SqlConn Exsql = new B_SqlConn())
            {
                DataSet ds = null;
                Exsql.Open();
                using (SqlCommand Cmd = new SqlCommand(strProName, Exsql.Conn))
                {
                    Cmd.CommandType = CommandType.StoredProcedure;
                    for (int i = 0; i < stProParameters.Length; ++i)//注意,不是“i++”!
                    {
                        ProceducreParameter stProPar = stProParameters[i];
                        SqlParameter sp = new SqlParameter(stProPar.TabStrName, stProPar.TabStrType, stProPar.TabStrSize);
                        sp.Direction = stProPar.TabStrDirection;
                        sp.Value = stProPar.TabStrValue;
                        Cmd.Parameters.Add(sp);
                    }
                    SqlDataAdapter da = new SqlDataAdapter(Cmd);
                    ds = new DataSet();
                    da.Fill(ds);
                    da.Dispose();
                    Cmd.Parameters.Clear();
                    Cmd.Dispose();
                }
                Exsql.Close();
                Exsql.Dispose();
                return ds;
            }
        }
}引用的时候:using BProc;ProcParameter Proce = new ProcParameter();
SqlDataReader sdr = Proce.Re_DataSet("储存过程名称",proc);还是使用静态: public static DataSet Re_DataSet(string strProName, ProceducreParameter[] stProParameters)
调用的时候直接:ProcParameter..Re_DataSet("储存过程名称",proc);哪个方法是最佳选择的,最专业合理的?这几年我一直用的都是实例化调用的方式,但不知道是不是最好的数据库

解决方案 »

  1.   

    SqlDataReader sdr = Proce.Re_DataSet("储存过程名称",proc);你这类的类型写错了。这可不是小事。如果是DataSet,那么它不是占用物理连接的。如果是DbDataReader,那么就是占用连接的,是不应该这样写的。如果这里是笔误,是DataSet(而跟任何Reader无关),那么就对了。在你的代码中,da.Dispose();
    Cmd.Parameters.Clear();
    Cmd.Parameters.Clear();
    Cmd.Dispose();
    Exsql.Close();
    Exsql.Dispose();
    这几行代码都是画蛇添足。在using{}跳出的时候,会自动调用Exsql.Dispose(),而它会自动调用 Exsql.Close()。事实上你知道该写什么代码去释放什么东西,才应该写。不知道,多写一堆东西,没有任何作用(除了耽误一些程序运行时间以外)。最后说到你的Re_DataSet方法。这里使用static还是对象方法,都是可以的。我会比较愿意写为static方法。但是这绝非什么“效率”问题,而是因为我在写这个代码时就这个层次,还没有发现需要定义为对象方法的必要。反过来说,如果你的某种设计,需要定义为对象方法,例如你的类 ProcParameter 可能需要子类来扩展和对消(或者说重写)父类,那么自然我可能就定义以个叫做  Gt_DataSet 的对象方法(使用它必须先new一个对象,然后才调用它)以示跟 Re_DataSet 方法区分开来。不要在这么浅的地方过于纠结“专业不专业”的。你要是知道如何专业地设计程序,你就没有经历先把时间用在这种地方了。
      

  2.   

    简单来说,如果你拿不出测试代码来说明问题,那么对于“可以不可以把一个方法定义为static的”,这个问题,不要再多花精力。你只要听着自己的最初的设计。假设不需要面向对象设计,那么我可能就在第一时间写上public static class MySqlHeler
    {
        public static DataSet Re_DataSet(......)
        {
           ......
    这种代码,我会在class的声明上就定义为static的,而省得再去考虑每个方法是否要写static的问题。但这我更愿意说是个人爱好。我绝对不会用“你不专业”这种说法去指责别人写为对象方法的代码。因为我认为这不但是重点,而且历史证明,这被用来攻击和指责别的初学者,已经脱离了技术范畴了。
      

  3.   


    是的,你说的没错 SqlDataReader sdr = Proce.Re_DataSet("储存过程名称",proc);我这个只是随便截取了个格式而已  呵呵