C# 用C语言请求数据库

C# 用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

我想知道下面的代码是否是处理数据库的旧方法。或者我可以使用更现代、更高效的方法

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

使用普通ADO.NET仍然是一种非常有效的方法。只需确保使用块包装您的可支配资源。像这样:

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框架,如实体框架或实体框架。或者使用简单的ADO.NET等更轻的工具仍然是一种非常有效的方法。只需确保使用块包装您的可支配资源。像这样:

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框架,如实体框架或实体框架。或者更轻的版本,例如。

虽然这样的代码是可以接受的,但我强烈建议您使用LINQ to SQL,或者是Microsoft提供的版本,或者是在http://bltoolkit.net,目前它拥有最快的LINQ解析器


忘了提到,在您的数据库中,如果不从最终用户筛选查询的参数,您的数据库将非常容易受到SQL注入攻击,尤其是在构建网站时

虽然这样的代码是可以接受的,但我强烈建议您使用LINQ to SQL,或者是Microsoft提供的版本,或者是在http://bltoolkit.net,目前它拥有最快的LINQ解析器

忘了提到,在您的数据库中,如果不从最终用户筛选查询的参数,您的数据库将非常容易受到SQL注入攻击,尤其是在构建网站时

您可以使用或

还有一些其他的解决方案,如nHibernate,但是第一个与.NET一起诞生的解决方案,您可以使用或


还有一些其他的解决方案,比如nHibernate,但是第一个是用.NET自带的,不是用vanilla 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驱动程序

现代替代品


更现代的方法是使用OR/M框架,例如OR。还有更多的轻量级层,如或

否。不使用vanilla 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驱动程序

现代替代品


更现代的方法是使用OR/M框架,例如OR。还有更多的轻量级层,例如或

这是我使用的层,只是我没有采取4个步骤初始化CommandText:这是我使用的层,只是我没有采取4个步骤初始化CommandText: