.net 多个SQlCommand.ExecuteReader调用或使用datareader.NextResult()执行一次?

.net 多个SQlCommand.ExecuteReader调用或使用datareader.NextResult()执行一次?,.net,winforms,ado.net,class-design,data-access,.net,Winforms,Ado.net,Class Design,Data Access,我正在使用SqlDataReader在Winform应用程序中填充一个实体。实体类在数据库中有几个外键属性,我想将它们设置为实体类中的属性。每个属性的类型都是“Attribute”,带有ID和Description属性 系统的一些用户远离数据库,因此数据访问性能是一个重要的考虑因素 我可以对返回单个结果集的存储过程多次执行SqlCommand.ExecuteReader(每个属性一次),也可以对返回多个结果集的存储过程执行SqlCommand.ExecuteReader一次,并使用SqlData

我正在使用SqlDataReader在Winform应用程序中填充一个实体。实体类在数据库中有几个外键属性,我想将它们设置为实体类中的属性。每个属性的类型都是“Attribute”,带有ID和Description属性

系统的一些用户远离数据库,因此数据访问性能是一个重要的考虑因素

我可以对返回单个结果集的存储过程多次执行SqlCommand.ExecuteReader(每个属性一次),也可以对返回多个结果集的存储过程执行SqlCommand.ExecuteReader一次,并使用SqlDataReader.NextResult遍历并设置属性

如果我使用.NextResult进行循环,那么在确保存储过程和属性分配循环对齐方面会遇到一些问题。如果proc更改顺序中SELECT语句的顺序,则winform应用程序中的分配顺序将混乱

如果SqlDataReader每次读取都返回数据库,那么执行SqlCommand.ExecuteReader会增加很多时间吗?为每个属性执行ExecuteReader将使赋值方面的内容更加清晰


谢谢

使用.Nextresult,ADO.Net不会返回每个结果集的数据库。所有这些逻辑都在运行的ADO.Net数据提供程序中(在您的数据访问层中,可能在您的应用程序服务器上,或者在您的UI层中)

但是,如果多次执行datareader,则每次调用都将进行一次到数据库的rtound访问。因此,如果执行此代码的层距离数据库有一定距离(以往返时间为单位),则最好使用.NextResult技术


您还应该考虑使用数据集(具有多个数据项)而不是数据读取器。你可能会发现这更有效

使用.Nextresult,ADO.Net不会返回每个结果集的数据库。所有这些逻辑都在运行的ADO.Net数据提供程序中(在您的数据访问层中,可能在您的应用程序服务器上,或者在您的UI层中)

但是,如果多次执行datareader,则每次调用都将进行一次到数据库的rtound访问。因此,如果执行此代码的层距离数据库有一定距离(以往返时间为单位),则最好使用.NextResult技术


您还应该考虑使用数据集(具有多个数据项)而不是数据读取器。你可能会发现这更有效

我很好奇:什么时候使用数据集(带有DataAdapter)会比使用DataReader更“高效”?只是因为DataAdapter使用了下面的DataReader,我想知道是什么神秘的魔力让DataAdapter运行得更快,而不是用户的最终代码?老实说,我不太确定,但是(以下是一个猜测),这可能是因为ADO.Net提供程序中用数据“填充”数据集的代码是优化的(可能是用C++/assembly编写的?)快速执行此操作,然后断开与数据库的连接,而当您使用datareader时,您必须自己编写此代码,使用对std CLR framework类的调用,并且您的代码无法断开连接,直到它完成读取并使用读取器中的最后一条记录为止……对于任何可能创建多个DB connec的应用程序来说但是,影响可伸缩性的最大因素不是连接的功能,而是连接保持打开的时间。我很好奇:什么时候使用数据集(带有DataAdapter)会更“高效”仅仅是使用DataReader?只是因为DataAdapter使用了下面的DataReader,我想知道是什么神秘的魔力使DataAdapter运行得更快,而不是用户的最终代码?老实说,我不太确定,但是(以下是一个猜测)这可能是因为ADO.Net提供程序中用数据“填充”数据集的代码经过优化(可能是用C++/assembly编写的?)快速执行此操作,然后断开与数据库的连接,而当您使用datareader时,您必须自己编写此代码,使用对std CLR framework类的调用,并且您的代码无法断开连接,直到它完成读取并使用读取器中的最后一条记录为止……对于任何可能创建多个DB connec的应用程序来说但是,影响可伸缩性最大的不是连接的功能,而是连接保持打开的时间。