c# - MultipleActiveResultSets = True ou plusieurs connexions?





.net sql-server sql-server-2005 ado.net (4)


C'est pour autant que je sache la raison pour laquelle MARS a été ajouté, alors oui je pense que vous devriez l'utiliser.

J'ai un certain C # dans lequel je crée un lecteur sur une connexion ( ExecuteReader ), puis pour chaque rangée dans ce lecteur, exécutez une autre commande (avec ExecuteNonQuery ). Dans ce cas, est-ce mieux que j'utilise MultipleActiveResultSets=True sur ma connexion ou que j'utilise plusieurs connexions?




Plusieurs ensembles de résultats actifs (MARS) ont été ajoutés spécifiquement pour ce type d'opération, de sorte que vous n'avez pas besoin d'avoir deux connexions ouvertes en même temps pour pouvoir lire à partir d'un SqlDataReader ET exécuter des lots supplémentaires.

MARS est compatible avec SQL Server 2005 et supérieur. Pour citer des documents MSDN:

Avant l'introduction des ensembles de résultats actifs multiples (MARS), les développeurs devaient utiliser plusieurs connexions ou des curseurs côté serveur pour résoudre certains scénarios.

Pour plus d'informations, voir:

MSDN Library - Présentation de MARS

Exemple de lecture et de mise à jour des données:

MSDN Library - Manipuler des données (MARS) faites défiler jusqu'à 'Lire et mettre à jour des données avec MARS'




La meilleure façon de tester cela est de lancer SQLServer Profiler, et de voir ce qui se passe vraiment du côté serveur.

Ma conjecture est que ce ne sera pas mieux puisque vous utilisez ExecuteNonQuery (). Donc, en fait, vous ne travaillez pas avec plusieurs résultats.




There are a lot excellent answers here, but I want to touch on something I didn't see mentioned: Object oriented design is about empowering objects .

You want to encapsulate all your rules, additional work and internal details inside an appropriate object. In this way other objects interacting with this one don't have to worry about it all. In fact, you want to go a step further and actively prevent other objects from bypassing these internals.

When you inherit from List , all other objects can see you as a List. They have direct access to the methods for adding and removing players. And you'll have lost your control; par exemple:

Suppose you want to differentiate when a player leaves by knowing whether they retired, resigned or were fired. You could implement a RemovePlayer method that takes an appropriate input enum. However, by inheriting from List , you would be unable to prevent direct access to Remove , RemoveAll and even Clear . As a result, you've actually disempowered your FootballTeam class.

Additional thoughts on encapsulation... You raised the following concern:

It makes my code needlessly verbose. I must now call my_team.Players.Count instead of just my_team.Count.

You're correct, that would be needlessly verbose for all clients to use you team. However, that problem is very small in comparison to the fact that you've exposed List Players to all and sundry so they can fiddle with your team without your consent.

You go on to say:

It just plain doesn't make any sense. A football team doesn't "have" a list of players. It is the list of players. You don't say "John McFootballer has joined SomeTeam's players". You say "John has joined SomeTeam".

You're wrong about the first bit: Drop the word 'list', and it's actually obvious that a team does have players.
However, you hit the nail on the head with the second. You don't want clients calling ateam.Players.Add(...) . You do want them calling ateam.AddPlayer(...) . And your implemention would (possibly amongst other things) call Players.Add(...) internally.

Hopefully you can see how important encapsulation is to the objective of empowering your objects. You want to allow each class to do its job well without fear of interference from other objects.





c# .net sql-server sql-server-2005 ado.net