Получить все данные строк и столбцов, используя SELECT - C#

Я пытаюсь получить все данные из таблицы SQL и сохранить их в списке с использованием языка программирования C#.

оператор SQL, который я использую:

private string cmdShowEmployees = "SELECT * FROM Employees;";

Это используется в том же классе, что и функция

public List<string> showAllIdData()
{
  List<string> id = new List<string>();
  using (sqlConnection = getSqlConnection())
  {
    sqlCommand.Connection = sqlConnection;
    sqlCommand.CommandText = cmdShowEmployees;
    SqlDataReader reader = sqlCommand.ExecuteReader();
    while (reader.Read()) {
      id.Add(reader[0].ToString());
    }
    return id;
  }
}

и здесь

public List<string> showAllActiveData()
{
  List<string> active = new List<string>();
  using (sqlConnection = getSqlConnection())
  {
    sqlCommand.Connection = sqlConnection;
    sqlCommand.CommandText = cmdShowEmployees;
    SqlDataReader reader = sqlCommand.ExecuteReader();
    while (reader.Read()) {
      active.Add(reader[1].ToString());
    }
    return active;
  }

Мне нужно было бы создать еще 9 функций таким образом, чтобы получить все данные из таблицы "Сотрудники". Это кажется очень неэффективным, и мне было интересно, есть ли более элегантный способ сделать это.

Я знаю, что использование адаптера - это один из способов сделать это, но я не думаю, что можно преобразовать заполненный адаптер в список, список и т. Д.

SqlDataAdapter adapter = sqlDataCollection.getAdapter();
DataSet dataset = new DataSet();
adapter.Fill(dataset, "idEmployees");
dataGridView1.DataSource = dataset;
dataGridView1.DataMember = "idEmployees";

Есть идеи?

3 ответа

Решение

Если вы должны использовать ридер таким образом, почему бы не создать объект, содержащий данные строки таблицы.

public class SomeComplexItem
{
    public string SomeColumnValue { get; set;}
    public string SomeColumnValue2 { get; set;}
    public string SomeColumnValue3 { get; set;}
    public string SomeColumnValue4 { get; set;}
}

Таким образом, вы можете выполнить цикл с вашим читателем следующим образом:

public List<string> showAllActiveData()
{
    List<SomeComplexItem> active = new List<SomeComplexItem>();
    using (sqlConnection = getSqlConnection())
    {
        sqlCommand.Connection = sqlConnection;
        sqlCommand.CommandText = cmdShowEmployees;
        SqlDataReader reader = sqlCommand.ExecuteReader();
        while (reader.Read())
        {
            var someComplexItem = new SomeComplexItem();
            someComplexItem.SomeColumnValue = reader[1].ToString();
            someComplexItem.SomeColumnValue2 = reader[2].ToString();
            someComplexItem.SomeColumnValue3 = reader[3].ToString();

            active.Add(someComplexItem);
        }
        return active;

    }

Вы можете использовать два оператора выбора, чтобы заполнить два List<string> как показано в примере ниже, где ключ между чтениями reader.NextResult();,

Используемая база данных является стандартной базой данных Microsoft NorthWind.

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

namespace SQL_Server_TwoList
{
    public class DataOperations
    {
        public List<string> Titles { get; set; }
        public List<string> Names { get; set; }

        /// <summary>
        /// Trigger code to load two list above
        /// </summary>
        public DataOperations()
        {
            Titles = new List<string>();
            Names = new List<string>();
        }
        public bool LoadData()
        {
            try
            {
                using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.ConnectionString))
                {
                    string commandText = @"
                    SELECT [TitleOfCourtesy] + ' ' + [LastName] + ' ' + [FirstName] As FullName FROM [NORTHWND.MDF].[dbo].[Employees]; 
                    SELECT DISTINCT [Title] FROM [NORTHWND.MDF].[dbo].[Employees];";

                    using (SqlCommand cmd = new SqlCommand(commandText, cn))
                    {

                        cn.Open();

                        SqlDataReader reader = cmd.ExecuteReader();

                        // get results into first list from first select
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                Names.Add(reader.GetString(0));
                            }

                            // move on to second select
                            reader.NextResult();

                            // get results into first list from first select
                            if (reader.HasRows)
                            {
                                while (reader.Read())
                                {
                                    Titles.Add(reader.GetString(0));
                                }
                            }
                        }
                    }
                }
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}

Код формы

namespace SQL_Server_TwoList
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DataOperations dataOps = new DataOperations();
            if (dataOps.LoadData())
            {
                listBox1.DataSource = dataOps.Names;
                listBox2.DataSource = dataOps.Titles;
            }
        }
    }
}

Вы всегда можете добавить все это к набору данных или к базе данных, вместо того, чтобы циклически использовать использование datareader для добавления в массив. Набор данных позволяет вам в любом случае обращаться к данным аналогично массиву.

        Connstr = "Data Source = " + SelectedIP + "; Initial Catalog = " + dbName + "; User ID = " + txtUsername.Text +"; Password = "+ txtPassword.Text +"";
        conn = new SqlConnection(Connstr);
        try
        {
            string contents = "SELECT * FROM ..."
            conn.Open();
            SqlDataAdapter da_1 = new SqlDataAdapter(contents, conn);   //create command using contents of sql file
            da_1.SelectCommand.CommandTimeout = 120; //set timeout in seconds

            DataSet ds_1 = new DataSet(); //create dataset to hold any errors that are rturned from the database

            try
            {
                //manipulate database
                da_1.Fill(ds_1);

                if (ds_1.Tables[0].Rows.Count > 0) //loop through all rows of dataset
                {
                   for (int i = 0; i < ds_1.Tables[0].Rows.Count; i++)
                    {
                                            //rows[rownumber][column number/ "columnName"]
                        Console.Write(ds_1.Tables[0].Rows[i][0].ToString() + " ");
                    }
                }
             }
             catch(Exception err)
             {}
         conn.Close();
      }
      catch(Exception ex)
      {}
Другие вопросы по тегам