Как записать данные из базы в переменную?
Допустим у меня есть таблица 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 шт):
Пример реализации:
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>()
Очень часто в коде новичков я встречал классы, наподобие вашего. По сути, это бесполезный класс-обёртка для 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() и пр.
При использовании вашего класса эти методы становятся недоступны.