Метод набора данных C #

#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», который обрабатывает весь доступ к данным. Я включаю статические методы для «основной» функциональности, а также разрешаю пользователю создавать объект с указанной строкой подключения.

Вопросы, касающиеся примера кода:

  1. Важно иметь using инструкции для каждого класса данных.
  2. Добавьте параметры перед вызовом Open для создания читаемого кода.
  3. Я намеренно не использую адаптер данных для этого кода, чтобы показать, что можно создавать DataSet и добавлять таблицы данных по мере необходимости. (Обратите внимание, что использование адаптера данных с хранимой процедурой, которая возвращает несколько наборов результатов, заполняет набор данных таблицей данных для каждого набора результатов.)
  4. Я намеренно не обрабатываю исключение. Поскольку это служебный класс, стандартная практика позволяет исключениям всплывать до вызывающего.
  5. Это пример кода, который показывает, что вы хотите сделать, и как я обрабатываю низкоуровневый доступ к данным. Этот код не был протестирован, но этот код-шаблон я использую постоянно.

Пример класса

 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<
    }

}