在asp.net中访问sproc数据最干净的方法

时间:2010-11-30 11:32:42

标签: asp.net

我暂时没有使用SqlCommand等访问数据,因为我现在倾向于使用NHibernate。我只是想知道以下代码是否可以改进。我试图使用最佳实践(在一些谷歌之后)并且潜在的异常被捕获在更高层。

[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!

祝福,

基督教

1 个答案:

答案 0 :(得分:2)

有几种方法可以改善它:

  • 虽然WebMethod提取数据并在没有输入参数的情况下逐字返回,但我建议将服务接口和数据分成单独的类。它可能会使事情在以后更容易维护。
  • 假设您的框架中还有其他数据库调用,您可能需要考虑数据层中的辅助方法,它包装了存储过程的调用。这样,您只有一个方法可以将所有SP调用过滤到这个方法中,这将再次使事情更容易维护。
  • 使连接字符串的'bla'键设置为常量,这样您就可以轻松地重复使用和更改。
  • 这同样适用于存储过程的名称,或者使其成为web.config的一部分 - 这意味着您可以更改存储的proc名称而无需重新编译。
  • 如果抛出异常,则不会对此进行处理,因此异常将向调用者冒泡,考虑捕获和处理/记录异常。这就是说你确实提到你在更高层处理异常,所以我认为这是在调用你的webservices的任何事情上完成的。
  • 你应该处理SQL命令对象(如果你实现了异常处理,最后在try / catch / finally中)

编辑:代码示例

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