Запрос баз данных с помощью C#

#c# #.net #sql

#c# #.net #sql

Вопрос:

Мне интересно, является ли следующий код старым подходом для работы с базой данных. Или я могу использовать более современный и продуктивный подход?

 using(SqlConnection con = new SqlConnection(Properties.Settings.Default.EventLogPrinterConnectionString))
{
    SqlCommand com = new SqlCommand("", con);

    string sql_com_sel = "";
    sql_com_sel = @"SELECT DISTINCT Users, Pages, Date FROM View_lastactiveUser WHERE (Date >= @ds AND Date <= @dp AND Pages > 0) ORDER BY Date";
    com.CommandText = sql_com_sel;
    com.Parameters.Clear();
    com.Parameters.Add("@ds", SqlDbType.DateTime).Value = ds;
    com.Parameters.Add("@dp", SqlDbType.DateTime).Value = dp;
    con.Open();
    SqlDataReader dr = com.ExecuteReader();
    while (dr.Read())
    {
        users.Add(new UserDemo() { LastActivity = dr["Date"].ToString(), Pages = int.Parse(dr["Pages"].ToString()), User = dr["Users"].ToString() });
    }
    con.Close();
    return users;
}
  

Комментарии:

1. Это тот, который я использую, за исключением того, что я не выполняю 4 шага для инициализации CommandText 🙂

Ответ №1:

вы могли бы использовать LinqToSql или ADO.NET Обзор Entity Framework

Существуют также некоторые другие решения, такие как NHibernate, но первое из них изначально поставляется с .NET

Ответ №2:

Используя обычный ADO.NET по-прежнему является очень правильным подходом. Просто убедитесь, что ваши доступные ресурсы упакованы в using блоки. Вот так:

 using(SqlConnection con = new SqlConnection(Properties.Settings.Default.EventLogPrinterConnectionString))
using (IDbCommand com = con.CreateCommand())
{
    con.Open();
    var sql_com_sel = @"SELECT DISTINCT Users, Pages, Date FROM View_lastactiveUser WHERE (Date >= @ds AND Date <= @dp AND Pages > 0) ORDER BY Date";
    com.CommandText = sql_com_sel;
    com.Parameters.Add("@ds", SqlDbType.DateTime).Value = ds;
    com.Parameters.Add("@dp", SqlDbType.DateTime).Value = dp;
    using (IDataReader dr = com.ExecuteReader())
    {
        while (dr.Read())
        {
            users.Add(new UserDemo() { LastActivity = dr["Date"].ToString(), Pages = int.Parse(dr["Pages"].ToString()), User = dr["Users"].ToString() });
        }
        return users;
    }
}
  

Конечно, вы могли бы также использовать платформу ORM, такую как NHibernate или Entity Framework. Или что-нибудь более легкое, такое как Dapper.

Ответ №3:

хотя такой код приемлем, я настоятельно рекомендую вам использовать LINQ to SQL, либо версию, предоставленную Microsoft, либо лучшую, найденную на http://bltoolkit.net , на данный момент у нее самый быстрый анализатор LINQ.

Забыл упомянуть, что в вашем случае, если вы не отфильтруете параметры запроса от конечного пользователя, ваша база данных будет очень уязвима для атак с использованием SQL-инъекций, особенно если вы создаете веб-сайт.

Ответ №4:

Нет. Не с помощью ванили ADO.NET . Но более общий подход выглядит примерно так:

 string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string providerName = ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName;

DbProviderFactory provider = DbProviderFactories.GetFactory(providerName);

using (DbConnection cn = provider.CreateConnection())
{
    cn.ConnectionString = connectionString

    using (DbCommand command = cn.CreateCommand())
    {
        command.CommandText = "GetAllCustomers";
        command.CommandType = CommandType.StoredProcedure;
        cn.Open();

        using (DbDataReader dr = command.ExecuteReader())
        {
            // Do Something...
        }
    }
}
  

Видишь? Никаких конкретных ADO.NET драйвер где угодно. Читайте больше здесь.

Современные альтернативы

Более современный подход заключается в использовании фреймворка a ИЛИ / M, такого как entity framework или nhibernate. Существуют также более легкие уровни, такие как Dapper или PetaPoco