111,083
社区成员




public static List<T> GetList<T>(string connectionString, string sql, Func<IDataReader, T> Converter, params Tuple<string, object>[] parameters)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
var cmd = new SqlCommand(sql, conn);
foreach (var param in parameters)
cmd.Parameters.AddWithValue(param.Item1, param.Item2);
return (from IDataReader rd in cmd.ExecuteReader() select Converter(rd)).ToList();
}
}
或者跨(不同类型)数据库的通用方法 public static List<T> GetList<T>(DbProviderFactory factory, string sql, Func<IDataReader, T> Converter, params Tuple<string, object>[] parameters)
{
using (var conn = factory.CreateConnection())
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Connection = conn;
foreach (var param in parameters)
{
var p = cmd.CreateParameter();
p.ParameterName = param.Item1,
p.Value = param.Item2;
cmd.Parameters.Add(p);
}
return (from IDataReader rd in cmd.ExecuteReader() select Converter(rd)).ToList();
}
}
总之,不反射。 List<ResultType> result;
using (var conn = new SqlConnection(SqlHelper.ConnectionString))
{
var cmd = new SqlCommand("select * from [table] where dv>=@dv and name<>@name", conn);
cmd.Parameters.AddWithValue("dv", 12);
cmd.Parameters.AddWithValue("name", "xxx");
result = (from IDataRecord rd in cmd.ExecuteReader()
select new ResultType
{
Name = (string)rd["Name"],
Cost = (decimal)rd["Cost"]
})
.ToList();
}
也就是说直接用比较明确的、不含反射的方式,产生强类型的对象集合就好了。 //第一次测试数据作废
object x = Console.ReadLine();
int y = Convert.ToInt32(x == "" ? 0 : x);
Stopwatch swT = new Stopwatch();
swT.Start();
List<TestTable> listT = DbHelper.GetDataToList<TestTable>("SELECT * FROM test_table LIMiT 0, " + y);
swT.Stop();
TimeSpan tsT = swT.Elapsed;
Console.WriteLine("SuperRocky算法总共消耗{0}ms.", tsT.TotalMilliseconds);
while (true)
{
object a = Console.ReadLine();
object b = Console.ReadLine();
double sum = 0;
if (2 == Convert.ToInt32(a == "" ? 0 : a))
{
}
int c = Convert.ToInt32(a == "" ? 0 : a);
int d = Convert.ToInt32(b == "" ? 0 : b);
TimeSpan ts;
for (int i = 0; i < d; i++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
//string strJson = DbHelper.GetDataToJson("SELECT * FROM test_table LIMiT 0, " + b);
List<TestTable> list = DbHelper.GetDataToList2<TestTable>("SELECT * FROM test_table LIMiT 0, " + c);
sw.Stop();
ts = sw.Elapsed;
Console.WriteLine("SuperRocky算法总共消耗{0}ms.", ts.TotalMilliseconds);
sum += ts.TotalMilliseconds;
}
Console.WriteLine("SuperRocky算法执行总共执行{0}次,平均消耗{1}ms", d, sum / d);
}
关于测试方法我重新弄了一个,这个应该比较准确一点