首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

再继续请问:数据库读取类是静态方法好还是实例化好

2013-07-08 
再继续请教:数据库读取类是静态方法好还是实例化好?刚才问了个数据库连接的 现在请教一个读取类的:如:name

再继续请教:数据库读取类是静态方法好还是实例化好?
刚才问了个数据库连接的 现在请教一个读取类的:
如:

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);

哪个方法是最佳选择的,最专业合理的?这几年我一直用的都是实例化调用的方式,但不知道是不是最好的 数据库 类
[解决办法]
高度频繁的重用方法,用静态更方便。不过建议你使用微软的企业图库,操作数据库更方便的简洁。
[解决办法]
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 方法区分开来。



不要在这么浅的地方过于纠结“专业不专业”的。你要是知道如何专业地设计程序,你就没有经历先把时间用在这种地方了。
[解决办法]
简单来说,如果你拿不出测试代码来说明问题,那么对于“可以不可以把一个方法定义为static的”,这个问题,不要再多花精力。你只要听着自己的最初的设计。假设不需要面向对象设计,那么我可能就在第一时间写上

public static class MySqlHeler
{
    public static DataSet Re_DataSet(......)
    {
       ......

这种代码,我会在class的声明上就定义为static的,而省得再去考虑每个方法是否要写static的问题。

但这我更愿意说是个人爱好。

我绝对不会用“你不专业”这种说法去指责别人写为对象方法的代码。因为我认为这不但是重点,而且历史证明,这被用来攻击和指责别的初学者,已经脱离了技术范畴了。

热点排行