Как записать данные из базы в переменную?

Допустим у меня есть таблица objects с 1 столбцом Objnumber где значения object1, object2... Я хочу записывать с помощью цикла все значения по очереди в 1 переменную (string name). Как мне это сделать, подскажите пожалуйста.
Класс для подключения:

internal class ConnectionDB
{
    SqlConnection sqlConnection = new SqlConnection("Строка подключения");

    public void opnenConnection()
    {
        if (sqlConnection.State == System.Data.ConnectionState.Closed)
        {
            sqlConnection.Open();
        }
    }
    public void closeConnection()
    {
        if (sqlConnection.State == System.Data.ConnectionState.Open)
        {
            sqlConnection.Close();
        }
    }
    public SqlConnection getConnection()
    {
        return sqlConnection;
    }
}

Ответы (2 шт):

Автор решения: Frehzy

Пример реализации:

internal static class Converter
{
    public static IEnumerable<T> ToEnumerable<T>(this DataTable dataTable)
    {
        var objType = typeof(T);
        var properties = objType.GetProperties();

        var list = new List<T>();
        foreach (var row in dataTable.AsEnumerable())
        {
            var instance = (T)Convert.ChangeType(Activator.CreateInstance(objType), typeof(T));
            foreach (var prop in properties)
            { 
                var index = dataTable.Columns.IndexOf(prop.Name);
                if (index < 0)
                    continue;

                var item = row.ItemArray[index];
                prop.SetValue(instance, Convert.ChangeType(item, prop.PropertyType));
            }
            list.Add(instance);
        }
        return list;
    }
}

Допустим, у вас есть таблица, в которой есть 2 столбца: Id(int), Name(text). Создаёте класс по аналогии:

public class SomeTable
{
    public int Id { get; set;} 

    public string Name { get; set;} 

    public SomeTable() {} 
}

Получаете datatable из запроса и делаете следующее:

var list = myDt.ToEnumerable<SomeTable>()
→ Ссылка
Автор решения: Alexander Petrov

Очень часто в коде новичков я встречал классы, наподобие вашего. По сути, это бесполезный класс-обёртка для SqlConnection.

Как выглядит использование вашего класса:

var db = new ConnectionDB(); // создаём экземпляр класса
db.openConnection(); // открываем соединение
...db.getConnection()... // получаем и как-то используем соединение
db.closeConnection(); // закрываем соединение

Как выглядит использование стандартного класса:

var conn = new SqlConnection(_connectionString); // создаём экземпляр класса
conn.Open(); // открываем соединение
...conn... // как-то используем соединение
conn.Close(); // закрываем соединение

То же самое! 4 строки.
Так зачем нужна эта обёртка ConnectionDB?


Кроме того, при работе с БД может произойти какая-либо ошибка, в результате выполнение не дойдёт до строки закрытия соединения. Оно останется в подвешенном состоянии.

В вашем коде это можно решить следующим образом:

ConnectionDB db = null;
try
{
    db = new ConnectionDB();
    db.openConnection();
    ...db.getConnection()...
}
finally
{
    db?.closeConnection();
}

Громоздко, не правда ли?

А при использовании стандартного SqlConnection это делается так:

using var conn = new SqlConnection(_connectionString);
conn.Open();
...conn...

И это всё! Всего лишь добавили using. При этом убрав вызов Close. Код получился короче и полностью гарантирует очистку ресурсов даже в случае выброса исключения.

Такое возможно потому, что SqlConnection реализует интерфейс IDisposable.
Этот интерфейс можно реализовать и в вашем классе, но зачем? Это не прибавит ни капельки удобства/надёжности/лаконичности.


И я чуть не забыл о ещё одной важной детали - асинхронности!
Стандартные классы SqlConnection, SqlCommand, SqlDataReader имеют асинхронные методы: OpenAsync() и пр.
При использовании вашего класса эти методы становятся недоступны.

→ Ссылка