再继续请教:数据库读取类是静态方法好还是实例化好?
刚才问了个数据库连接的 现在请教一个读取类的:
如:
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的问题。
但这我更愿意说是个人爱好。
我绝对不会用“你不专业”这种说法去指责别人写为对象方法的代码。因为我认为这不但是重点,而且历史证明,这被用来攻击和指责别的初学者,已经脱离了技术范畴了。