#c# #coding-style #ado.net
#c# #стиль кодирования #ado.net
Вопрос:
В моей программе на 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();
Комментарии:
1. Есть ли подходящая причина, по которой вы не используете Entity Framework?
2. Не проглатывайте все исключения.
3. @Gnostus: EF не будет работать с Excel.
4. Я не понимаю проблемы. Вы хотите сказать, что включенный вами код не работает? Если да, пожалуйста, укажите, где и с каким исключением происходит сбой кода.
5. Я хочу, чтобы основная программа вызывала этот код из метода и выводила набор данных в основную программу, чтобы я мог использовать запрошенные данные в основной программе. Как мне написать метод и как мне написать вызов метода, который будет помещен в основную программу?
Ответ №1:
вы можете поместить это внутри класса как виртуальный или статический общедоступный метод, например
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();
Ответ №2:
Приведенный ниже пример класса — это общий шаблон, который я использую.
Я создаю класс «data-manager», который обрабатывает весь доступ к данным. Я включаю статические методы для «основной» функциональности, а также разрешаю пользователю создавать объект с указанной строкой подключения.
Вопросы, касающиеся примера кода:
- Важно иметь
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 oResu<
}
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 oResu<
}
}