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