C# 是否有更好/更快的方式访问原始数据?
这与特定问题无关,而是关于“最佳实践”的问题 有一段时间,当我需要直接从数据库中获取数据时,我一直在使用以下方法——我想知道是否有一种更快的方法我不知道C# 是否有更好/更快的方式访问原始数据?,c#,asp.net,C#,Asp.net,这与特定问题无关,而是关于“最佳实践”的问题 有一段时间,当我需要直接从数据库中获取数据时,我一直在使用以下方法——我想知道是否有一种更快的方法我不知道 DataTable results = new DataTable(); using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"])) { connection.Open(); using
DataTable results = new DataTable();
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"]))
{
connection.Open();
using (SqlCommand command = new SqlCommand("StoredProcedureName",connection))
{
command.CommandType = CommandType.StoredProcedure;
/*Optionally set command.Parameters here*/
results.Load(command.ExecuteReader());
}
}
/*Do something useful with the results*/
读取数据的方式确实多种多样
DataTable
是一个相当复杂的beast(支持许多复杂的场景—引用完整性、约束、计算值、动态附加列、索引、筛选等)。在很多情况下,你并不需要这些;你只需要数据。要做到这一点,一个简单的对象模型在内存和性能方面都会更有效。您可以围绕IDataReader
编写自己的代码,但这是一个已解决的问题,有一系列工具可以为您做到这一点。例如,您可以通过以下方式实现:
class SomeTypeOfRow { // define something that looks like the results
public int Id {get;set;}
public string Name {get;set;}
//..
}
...
var rows = connection.Query<SomeTypeOfRow>("StoredProcedureName",
/* optionalParameters, */ commandType: CommandType.StoredProcedure).ToList();
为了完整起见,我应该解释可选参数
;如果您想通过@id=1
,@name=“abc”
,那就是:
var rows = connection.Query<SomeTypeOfRow>("StoredProcedureName",
new { id = 1, name = "abc" },
commandType: CommandType.StoredProcedure).ToList();
与其谈论
行[“Id”]
,行[“Name”]
等等,看起来不错,您是否遇到了延迟?我认为您应该查看存储过程代码,而不是这里为什么您认为有更快的东西?您可以在表中使用SqlDataAdapter
,但我怀疑这是否会改变任何事情。@bUKaneer-如果您的查询正在工作并在可接受的时间内返回结果,我建议除了限制返回的数据以提高性能之外,您可以做的事情不多了(在您的情况下,这似乎没有必要)@Darren Davies谢谢你的意见-我没有一个大圈子的开发人员类型,我可以问这种类型的问题,所以我认为这是一个好地方,可以再次检查我自己的知识。不完全确定这是否符合网站的精神,但似乎没有违反常见问题解答中的规则!这让我大吃一惊,这正是我想要的!我将继续使用这种方法。你让我开心;o) 大的Grin@bUKaneer我有点倾向于dapper(我们将其作为堆栈交换的数据访问层的一部分编写),但是:也存在其他类似的工具:Simple.data、PetaPoco、Massive等,而这些只是轻量级的工具。也有起重工具;NHibernate、实体框架、LLBLGenPro、LINQ到SQL等等,我注意到你们是nuget的作者;o) 我曾经成功地使用过EF和linqtosql,但总是觉得它们比更直接的方法更重,而且可能更慢。我想知道事情是如何运作的,为什么要自下而上(CLR通过C#是我的圣经),然后使用/实现它们。我去把衣冠楚楚的衣服拉过来,随便看看@bUKaneer代码全部可用;它广泛使用ILGenerator(缓存),所以它的意义取决于您对IL的熟悉程度;pHey Marc只是想我再给你一张纸条来感谢你-我喜欢整洁!开始修补并创建了一篇带有基本示例的博客文章-真是太棒了!
var rows = connection.Query<SomeTypeOfRow>("StoredProcedureName",
new { id = 1, name = "abc" },
commandType: CommandType.StoredProcedure).ToList();
foreach(var row in rows) {
Console.WriteLine(row.Id);
Console.WriteLine(row.Name);
}