在asp.net中访问存储过程数据的最干净方法

在asp.net中访问存储过程数据的最干净方法,asp.net,Asp.net,我已经有一段时间没有使用SqlCommand等访问数据了,因为我现在倾向于使用NHibernate。我只是想知道下面的代码是否可以改进。我已经尝试使用最佳实践(在一些谷歌搜索之后),潜在的异常会在更高的层次被捕获 [WebMethod] public XmlDocument GetClassRegistrationReport() { XmlDocument doc = new XmlDocument(); using (SqlConnectio

我已经有一段时间没有使用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!
致以最良好的祝愿


Christian

有几种方法可以稍微改进一下:

  • 尽管WebMethod提取数据并一字不差地返回数据,但我建议将服务接口和数据分成不同的类。这可能会使以后的维护变得更容易
  • 假设在您的框架中有其他的DB调用,您可能需要考虑在数据层中的一个辅助方法,该方法封装了存储过程的调用。通过这种方式,您只有一个方法,所有SP调用都会过滤到该方法中,这将使将来的维护更加容易
  • 将连接字符串的“bla”键设置为常量,这样可以轻松地重用和更改
  • 这同样适用于存储过程的名称,或者将其作为web.config的一部分—这意味着您可以更改存储过程的名称,而无需重新编译
  • 如果抛出异常,则无法处理此事件,因此异常将冒泡到调用方,考虑捕获和处理/记录异常。也就是说,您提到您在更高的层上处理异常,所以我假设这是在调用您的Web服务的任何地方完成的
  • 您应该处理SQL命令对象(如果确实实现了异常处理,则在try/catch/finally的finally中)
编辑:代码示例


我已经更新了一些东西(将sql命令对象包装到using语句中)。在出现异常的情况下,这应该考虑关闭/处理,不是吗?ConfigurationManager.ConnectionString[“bla”]是否不访问web.config中的“全局变量”?你能给你的建议添加一些链接吗?谢谢至于配置和其他建议,一个例子能说明千言万语。因此,我将用代码示例编辑我的原始帖子
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;
    }
}