2010-11-30 6 views
0

Je n'ai pas accédé à des données en utilisant SqlCommand etc. pendant un moment car j'ai tendance à utiliser NHibernate ces jours-ci. Je me demande simplement si le code suivant pourrait être amélioré. J'ai essayé d'utiliser les meilleures pratiques (après quelques google-ing) et les exceptions potentielles sont prises à un niveau supérieur.façon la plus simple d'accéder aux données sproc dans asp.net

[WebMethod] 
    public XmlDocument GetClassRegistrationReport() 
    { 
     XmlDocument doc = new XmlDocument(); 

     using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["bla"].ToString())) 
     { 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "bla"; 
       command.CommandType = CommandType.StoredProcedure; 
       connection.Open(); 
       doc.Load(command.ExecuteXmlReader()); 
      } 
     } 

     return doc; 
    } 

Thanks! 

Meilleurs voeux,

Christian

Répondre

2

Il y a quelques façons dont vous pouvez améliorer un peu:

  • Bien que le WebMethod tire des données et retourne in extenso sans paramètre d'entrée , Je suggère de séparer l'interface de service et les données dans des classes séparées. Il peut rendre les choses plus faciles à maintenir à une date ultérieure.
  • En supposant qu'il existe d'autres appels de base de données dans votre infrastructure, vous pouvez envisager une méthode d'assistance dans votre couche de données qui termine l'appel d'une procédure stockée. De cette façon, vous ne disposez que d'une méthode que tous les appels SP filtrent, ce qui rendra les choses plus faciles à maintenir dans le futur.
  • Faites de la constante 'bla' pour votre chaîne de connexion une constante, de sorte que vous puissiez facilement la réutiliser et la modifier.
  • Il en va de même pour le nom de la procédure stockée, sinon faites-en partie dans votre fichier web.config - cela signifie que vous pouvez modifier le nom de la procédure stockée sans devoir la recompiler.
  • Si une exception est throw, il n'y a pas de gestion pour cela, donc l'exception sera envoyée à l'appelant, considérez les exceptions catching et handling/logging. Cela dit, vous mentionnez que vous gérez les exceptions à un niveau supérieur, donc je suppose que cela est fait dans tout ce qui appelle vos services web.
  • Vous devez disposer l'objet de commande SQL (en enfin du try/catch/finally si vous mettre en œuvre la gestion des exceptions)

EDIT: Exemple de code

public class MyWebService 
{ 
    [WebMethod] 
    public XmlDocument GetClassRegistrationReport() 
    { 
     return DataLayer.GetClassRegistrationReport(); 
    } 
} 
// Notice that this is a static internal class, internal to hide the 
// data access class from everything but this library and static because 
// we don't need instances and using statics will optimise a little. 
internal static class DataLayer 
{ 
    private const string SP_GetRegistrationReport = "GetRegistrationReport"; 
    private const string Config_DBConnectionString = "PrimaryDB"; 

    private static string GetDB 
    { 
     get 
     { 
      string dbConnectionString = ConfigurationManager.ConnectionStrings[Config_DBConnectionString].ConnectionString; 

      if (string.IsNullOrEmpty(dbConnectionString)) 
      { 
       // This error should could/should be in a resource file. 
       throw new ConfigurationException("Database connection string is not defined"); 
      } 

      return dbConnectionString; 
     } 
    } 

    internal static XmlDocument GetClassRegistrationReport() 
    { 
     XmlDocument doc = new XmlDocument(); 

     using (SqlConnection connection = new SqlConnection()) 
     { 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = SP_GetRegistrationReport; 
       command.CommandType = CommandType.StoredProcedure; 
       connection.Open(); 
       doc.Load(command.ExecuteXmlReader()); 
      } 
     } 

     return doc; 
    } 
} 
+0

I ont mis à jour les choses un peu (enveloppé l'objet de commande sql dans une instruction using). Cela devrait prendre soin de masquer/disposer dans le cas d'une exception ne devrait-il pas? Est-ce que ConfigurationManager.ConnectionStrings ["bla"] n'accède pas à une "variable globale" dans le fichier web.config? Pourriez-vous s'il vous plaît ajouter des liens à vos suggestions? Merci! – cs0815

+0

Re disposer - oui cela va faire l'affaire. – MrEyes

+0

Quant à la configuration et les autres suggestions, un exemple parle mille mots. Donc, je vais modifier mon message original avec un échantillon de code – MrEyes

Questions connexes