Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有更好/更快的方式访问原始数据?_C#_Asp.net - Fatal编程技术网

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