我想知道以下代码是否是使用数据库的旧方法。或者我可以使用更现代和更有效的方法?
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;
}
答案 0 :(得分: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。
答案 1 :(得分:2)
您可以使用LinqtoSQL或The ADO.NET Entity Framework Overview
还有一些其他的解决方案,比如nHibernate,但是第一个用.NET来实现它
答案 2 :(得分:1)
虽然这样的代码是可以接受的,但我强烈建议您使用LINQ to SQL,无论是Microsoft提供的版本,还是使用http://bltoolkit.net
的更好的版本,目前它具有最快的LINQ解析器。
忘记提及,如果你不从最终用户过滤查询'参数,你的数据库将非常容易受到SQL注入攻击,特别是如果你正在构建一个网站。
答案 3 :(得分:1)
没有。不是香草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驱动程序。 Read more here
现代替代方案
更现代的方法是使用OR / M框架,例如entity framework或nhibernate。还有更轻量级的图层,例如Dapper或PetaPoco