请大家帮助看下,我的类应该怎样定义
我使用的类,基本上是ADO.NET数据操作。里面有很多方法,基本上都是获取表信息或者是表中数据信息。
数据连接使用方法:
OpenOledbConnection(string filename)
{
string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection oledbconn = new System.Data.OleDb.OleDbConnection(connstr);
oledbconn.Open();
return oledbconn;
}
然后获取信息使用的方法,如获取库中表名的方法:
public System.Collections.ArrayList GetTablenames(string filename)
{
System.Collections.ArrayList al = new System.Collections.ArrayList();
System.Data.OleDb.OleDbConnection oledbconn = OpenOledbConnection(filename);
System.Data.DataTable dtTable = oledbconn.GetSchema("Tables");
foreach (System.Data.DataRow dr in dtTable.Rows)
{
al.Add(dr["TABLE_NAME"].ToString().Substring(0,dr["TABLE_NAME"].ToString().Length-1));
}
oledbconn.Dispose();
return al;
}
获取表中记录的方法:
public System.Collections.ArrayList GetStudentname(string filename, string tablename,string columnname)
{
System.Collections.ArrayList al = new System.Collections.ArrayList();
System.Data.OleDb.OleDbConnection oledbconn = OpenOledbConnection(filename);
System.Data.OleDb.OleDbCommand oledbcmd = new System.Data.OleDb.OleDbCommand("select "+columnname +" from [" + tablename + "] ", oledbconn);
System.Data.OleDb.OleDbDataReader reader = oledbcmd.ExecuteReader();
while (reader.Read())
{
if (reader[0].ToString() != "")
{
al.Add(reader[0]);
}
}
reader.Close();
oledbcmd.Dispose();
oledbconn.Dispose();
return al;
}
在上面三个方法中均用到了filename这个参数,当然,将它放到每个方法中是不合适的,之所以这么做,是因为,在我的程序中有多处用到同时要访问两个数据库文件,如果将filename做为一个private string 或者public string 都不合适,示例代码如下:
foreach (string str in askclass.GetStudentname(desfilename.Text, tableslist.Text + "$", columnslist.Text))
{
askclass.InsertToTable(Application.StartupPath + "\\student.xls", tableslist.Text + "$", "姓名", str);
}
上面代码段中GetStudentname()和InsertToTable()中的filename为两个不同的数据文件。
请大家帮忙,我的filename应该怎样在类中定义呢?数据连接的方法OpenOledbConnection()是否合适?
谢谢大家。 --------------------编程问答-------------------- 你应该将文件名或者数据库连接字符串定义为一个singleton类。OpenOledbConnection方法的访问级别最好定义为private,以免类外部的调用在打开连接并执行操作后后不关闭连接。 --------------------编程问答-------------------- 上面代码中:InsertToTable(string filename,string tablename,string columnname,string colunmvalue)
GetStudent(string filename,string tablename,string colunmname)
--------------------编程问答-------------------- lijipan,小弟是菜鸟,希望能给予代码指导。 --------------------编程问答-------------------- OpenOledbConnection 是private的
InsertToTable()是public的
GetStudent()是public的
现在不知道filename应该用什么方式定义
singleton类?我怎么没查到,还望给予帮助。 --------------------编程问答-------------------- 我觉得这样也没有什么不妥的地方,如果一定要把参数改为属性,其实也不难,给你点提示。
首先把filename提升为属性,并且该属性只在构造函数中赋值:
public .ctor(string filename)
{
this.filename = filename;
}
private string filename
public string Filename
{
get { return this.filename; }
}
然后把原来的方法做适当的改动,例如:
OpenOledbConnection()
{
string onnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.filename + ";Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection oledbconn = new System.Data.OleDb.OleDbConnection(connstr);
oledbconn.Open();
return oledbconn;
}
最后,也是最重要的一点,就是在外部调用时要声明两个对象的实例,分别对应不同的文件,如下:
AskClass askclass1 = new AskClass(desfilename.Text);
AskClass askclass2 = new AskClass(System.IO.Path.Combine(Application.StartupPath, "student.xls"));
string tableName = tableslist.Text + "$";
foreach (string str in askclass1.GetStudentname(tableslist.Text + "$", columnslist.Text))
{
askclass2.InsertToTable(tableName, "姓名", str);
}
--------------------编程问答-------------------- 谢谢。 --------------------编程问答-------------------- 顶1楼的。
string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0";
放在open里不是很好。
如果lz你有时间,最好使用IConnection, IDataAdaptar等接口来写一个读写数据库的基类。(最好还支持stored producure。)
这样对oledb、sqldb、oracle都提供支持。
--------------------编程问答-------------------- mark
补充:.NET技术 , C#