在我的c#程序中,我有几个区域连接到excel电子表格。为了减少编码的重复,我试图编写一个方法,读取sql语句,然后输出一个数据集。
我怎么写这个方法?
其次,我应该用什么来创建这样一个模块?是方法、类还是其他什么?
这是我目前所知道的。
//Connection String to read Excel File into Dataset.
if (Path.GetExtension(brtFile) == ".xlsx")
{
ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";", brtFile);
}
else
{
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + brtFile + ";" +
"Extended Properties=Excel 8.0;";
}
//Read Excel file into Dataset.
OleDbConnection objConn = new OleDbConnection(ConnectionString);
try
{
objConn.Open();
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
Console.ReadLine();
}
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + xlWorksheet + "$]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
DataSet objDataset1 = new DataSet();
objAdapter1.Fill(objDataset1);
objConn.Close();
你可以把它作为虚拟或静态公共方法放在类中,例如
public class ExcelHelper
{
public static DataSet GetExcelData()
{
//your codes here
return objDataset1;
}
}
你可以这样调用
var xl = new ExcelHelper();
var ds = xl.GetExcelData();
或
var ds = new ExcelHelper().GetExcelData();
而如果您将其创建为静态方法,如
public class ExcelHelper {
public static DataSet GetExcelData()
{
return objDataset1;
}
}
你可以把它命名为
var ds = ExcelHelper.GetExcelData();
下面的示例类是我使用的一般模式。
创建一个"data-manager"类,它处理所有数据访问。我为core"功能,我还允许用户创建具有指定连接字符串的对象。
关于示例代码的要点:
- 在每个数据类周围都有
using
语句是很重要的。 - 在调用
Open
之前添加参数,使代码可读。 - 我故意不使用此代码的数据适配器,以表明可以创建
DataSet
并根据需要添加数据表。(请注意,使用带有返回多个结果集的存储过程的数据适配器,为每个结果集填充一个数据集,并使用一个数据表。) 我故意不处理异常。由于这是一个实用程序类,标准实践允许异常冒泡到调用者。 - 这是示例代码,以显示您想要的可以做到,以及我如何处理低级数据访问。这段代码还没有经过测试,但是这个代码模式我一直在使用。
public class ExcelDataManager
{
public string ConnectionString { get; set; }
public ExcelDataManager(string connectionString)
{
this.ConnectionString = connectionString;
}
public DataSet LoadDataSet(string commandText, string dataSetName, string tableName)
{
return LoadDataSet(this.ConnectionString, commandText, dataSetName, tableName);
}
public static DataSet LoadDataSet(string connectionString, string commandText, string dataSetName, string tableName)
{
DataSet oResult = null;
DataTable oDataTable = LoadDataTable(connectionString, commandText, tableName);
if (oDataTable != null)
{
string sDataSetName = dataSetName;
if (string.IsNullOrWhiteSpace(dataSetName))
{
sDataSetName = "DataSet1";
}
oResult = new DataSet(sDataSetName);
oResult.Tables.Add(oDataTable);
oResult.AcceptChanges();
}
return oResult;
}
public DataTable LoadDataTable(string commandText, string tableName)
{
return LoadDataTable(this.ConnectionString, commandText, tableName);
}
public static DataTable LoadDataTable(string connectionString, string commandText, string tableName)
{
DataTable oResult = null;
using (OleDbConnection oConnection = new OleDbConnection(connectionString))
{
using (OleDbCommand oCommand = oConnection.CreateCommand())
{
oCommand.CommandType = CommandType.Text;
oCommand.CommandText = commandText;
oCommand.Connection.Open();
using (OleDbDataReader oReader = oCommand.ExecuteReader(CommandBehavior.CloseConnection))
{
if (oReader.HasRows)
{
// You need a table name if you call WriteXml.
string sTableName = tableName;
if (string.IsNullOrWhiteSpace(tableName))
{
sTableName = "Table1";
}
oResult = new DataTable(sTableName);
oResult.Load(oReader);
oResult.AcceptChanges();
}
}
}
}
return oResult;
}
}