2009-01-19 6 views
5

J'ai une application C# que je crée qui stocke toutes les données dans SQL Server.Application C# - Dois-je utiliser des procédures stockées ou ADO.NET avec des techniques de programmation C#?

Parfois, il est plus facile pour moi d'apporter des modifications de données par programme et parfois il est plus facile d'avoir des procédures stockées et des fonctions dans la base de données SQL Server et de les appeler. Je suis plutôt novice en programmation et je ne connais pas les avantages et/ou les inconvénients subtils de chaque méthode.

Je pense que je devrais probablement faire les choses d'une façon ou d'une autre au lieu d'utiliser plusieurs méthodes.

Mon code commence à ressembler à une collection aléatoire de pensées tout simplement poussé en un seul endroit. Aucune offense à Joel Spolsky. J'aime ses livres.

Ceci est un projet solo, donc je peux refactoriser n'importe quelle quantité de code que je veux améliorer. Toutes les options sont sur la table.

Merci,

J3r3myK

Répondre

7

Eh bien, peuvent être stockées procs un niveau d'abstraction supplémentaire ou un ensemble de fonctions/méthodes si vous regardez la base de données comme un objet ou un service. Cela peut être bénéfique, car vous pouvez masquer les détails d'implémentation sous-jacents et les modifier au besoin sans casser l'application (tant que vous quittez l'interface, par exemple les paramètres proc stockés, seuls). En outre, si vous pouvez masquer les détails de votre table derrière un ensemble de procédures stockées, peu importe comment quelqu'un accède à votre base de données, il ne pourra interagir avec les méthodes que vous avez conçues et écrites pour lui -> il y a moins le risque que quelqu'un tire sur Excel et pirate votre base de données. D'autre part, Stored Proc nécessite une connaissance approfondie de T-SQL et vous allez répartir votre logique métier et applicative sur deux ensembles de bases de code, ce qui peut être un inconvénient. Tout ce que vous pouvez faire dans un proc stocké peut également être fait dans ADO.NET avec des instructions SQL directes, et ce n'est même plus lent. Un autre avantage de Stored Procs est le fait que si quelque chose ne va pas dans votre proc, vous pouvez le réparer simplement en déployant le proc avec le correctif - vous n'avez pas besoin de toucher votre application C#. Cela peut être un grand plus dans un environnement "hébergé" si vous ne recevez que 3 versions par an - l'application d'un correctif par le biais de la fixation d'un processus stocké peut être votre gagne-pain alors! :-)

Dans l'ensemble: il y a beaucoup de pour et de contre pour les procédures stockées; Je suggère, si vous vous sentez à l'aise avec l'écriture T-SQL, pourquoi ne pas essayer et voir comment cela fonctionne pour vous. Si cela vous semble lourd ou trop rigide ou si vous aimez trop travailler à long terme, vous pouvez toujours revenir à l'utilisation de SQL direct dans votre application C#.

Juste mes 0,02 $. Marc

4

Eh bien, vous allez finir par utiliser ADO.NET de toute façon ... on dirait que vous voulez dire des procédures stockées vs commande-texte. Il y a des avantages des deux, malheureusement, ce n'est pas une question simple, cependant, si vous regardez des outils comme LINQ, il y a plus d'avantages à commander-texte, car il peut être plus "composable" ajouter Skip/Take/Where/OrderBy et avoir un impact sur la requête globale). Une autre option qui combine les avantages de ces deux fonctions est la fonction table (via les fonctions UDF): elles ont également l'avantage de renforcer les métadonnées (il est difficile d'interroger précisément le schéma d'une procédure stockée).

Toute approche doit être sûre pour l'injection tant que vous utilisez correctement les paramètres.

2

Permettez-moi de reformuler: devriez-vous tirer vers le bas les données, la modification dans le code, puis ayant une mise à jour de SP DB avec les nouvelles valeurs, ou si vous appelez simplement la SP en tant que « fonction » .
Mon point d'emphase est, même si vous faites les manipulations de données dans le code, vous devriez toujours seulement accéder aux SP sur la base de données.

Que vous faire, ou ont SPs plus complexes ne la manipulation de données, dépendrait de plusieurs facteurs:

  • votre niveau de confort avec SQL complexe (par opposition à C#)
  • combien de données vous devez tirer vers le bas et modifier - il peut y avoir des aspects de performance (il en coûte pour tirer toutes ces données vers le code)
  • connecté au précédent, votre architecture peut entrer en jeu - par exemple êtes-vous en train d'accéder à un serveur db local, ou à distance
  • Quel type de manipulations vous devez faire, il peut être si complexe que vous ne voulez pas boueux votre sql
  • Quel genre de logique métier vous devez appliquer, quelle est la données dépendant, etc.

Il est vraiment à un jugement, il n'y a pas droit chemin (mais il y a beaucoup de mauvaises façons ...). Bien qu'il soit important de rester cohérent, il est parfaitement acceptable d'avoir différents types d'accès db dans votre système, tant que le contexte/besoin le justifie.
Je dirais choisir celui qui vous convient le mieux, et respectez-le - jusqu'à ce que vous ayez une raison de le faire différemment. Aucune raison d'être dogmatique à ce sujet ...

0

Je recommanderais de suivre une convention ou l'autre (soit avoir votre code SQL en tant que chaînes dans vos classes ou utiliser des procédures stockées). Il y a d'innombrables débats à ce sujet, mais il n'y a pas vraiment de raisons importantes de choisir l'un ou l'autre.

5

Deux points qui n'ont pas encore été traités:

Sprocs peuvent être placés dans un schéma, et usurper l'identité d'un autre schéma. Cela signifie que vous pouvez verrouiller l'accès à la base de données et donner aux utilisateurs des autorisations UNIQUEMENT pour exécuter vos SProcs, pas pour sélectionner update etc, ce qui est un très bon bonus de sécurité. Deuxièmement, le sproc peut être significativement plus rapide en fonction des opérations que vous effectuez. Si vous êtes contraint par des E/S réseau et que vous pouvez effectuer des opérations set sur vos données, le faire dans une seule procédure stockée au lieu de faire une extraction de l'ensemble de données ENTIRE, le traiter, puis transmettre le changement vous donnera une belle augmentation de vitesse. Il en va de même pour les transactions. Si vous devez effectuer des opérations en série (par exemple, changer une valeur dans deux tables à la fois, ce qui implique une certaine logique), vous devrez tenir une transaction pendant le temps nécessaire pour calculer la valeur et retransmettre dans deux requêtes SQL, alors que la procédure stockée peut le faire en une seule procédure.

Questions connexes