编写数据访问层方法的正确方法是什么?

时间:2011-08-17 07:26:20

标签: c# asp.net sql

这够好吗?我需要添加任何内容或删除任何内容吗?像回滚到我的Sql查询?添加catch()?我的函数应该只接受我需要的属性还是它自己的对象?如何让表示层知道函数的代码是在没有错误的情况下执行的...我应该把它写成书而不是空白还是什么?

    public static void DeleteAllCabinFeaturesFromACruise(int CruiseID)
    {
        string commandText = "DELETE FROM Cruise_Features WHERE CruiseID = @cruiseId";
        SqlConnection connection = new SqlConnection(ConnectionString);
        SqlCommand command = new SqlCommand(commandText, connection);

        try
        {
            using (connection)
            {
                using (command)
                {
                    command.Parameters.AddWithValue("@cruiseId", CruiseID);
                    connection.Open();
                    command.ExecuteScalar();
                }
            }
        }

        finally { connection.Close(); }
    }

4 个答案:

答案 0 :(得分:2)

您可以删除try ... finally块。 “使用”将为您处理连接。

编辑:正如chibacity所说,您应该在使用中初始化连接以确保正确处置。您的错误处理(以防止用户看到异常详细信息)应该在您的UI层中完成,而不是在您的数据层中完成。数据层抛出异常是完全合适的。

string commandText = "DELETE FROM Cruise_Features WHERE CruiseID = @cruiseId";

using (SqlConnection connection = new SqlConnection(ConnectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    // Your code.
}

对于像这样的简单查询可能不需要回滚 - 查询将成功或失败。对于更复杂的查询,如果要确保操作是原子的,则需要回滚。

答案 1 :(得分:2)

您没有正确使用usingusing的想法是包装一些需要在安全西方发布的资源,以保护它免受异常的影响。因此,使用using(ha-ha)的正确方法如下:

using(SqlConnection connection = new SqlConnection(ConnectionString)){
{
    using(SqlCommand command = new SqlCommand(commandText, connection)){
        //your code here
    }
}

第二个问题是您正在执行查询,就好像它应该返回Scalar值一样。没关系,但我认为最好只使用Executecommand.Execute();而且,如果你想要一些错误处理,你最好包装

connection.Open();
command.ExecuteScalar();
像你一样在try ... catch区块中的

。像这样:

//I would place it inside inner-most using block, but nothing wrong placing it outside
try{
    connection.open();
    command.Parameters.AddWithValue("@cruiseId", CruiseID);
     command.Execute();
}
//this catches ALL exceptions, regardless of source. Better narrow this down with
//some specific exception, like SQLException or something like that
catch (Exception e){
    return false; //or whatever you need to do
}

答案 2 :(得分:1)

  

如何让表示层知道函数的代码是在没有错误的情况下执行的?

这实际上归结为您希望如何处理这些案例。一个经验法则是问自己一个问题;你是否期望经常发生错误,或者不是?因此,例如,如果方法只有在出现通信错误时才会失败,那么向前端抛出异常就完全没问题了。另一方面,如果由于需要验证的各种业务规则(或者说,外键冲突)而导致删除操作可能会失败,那么您可能不应该将这些作为异常抛出。在后一种情况下,您的方法应返回一些有关成功的信息(简单版本:布尔值,复杂版本:您自己的“OperationResult”类)。

我在这里简化了很多事情,但我相信这些经验法则是有效的。

编辑:当我说“然后向前端抛出一个异常就完全没问题”时,我的意思是 - 把它扔到前端,但是让前端优雅地处理它!

答案 3 :(得分:0)

connection.Close()是多余的 - 使用(连接)将处置并关闭它。 此外,connection.Open()通常放在开头 - 以验证与服务器的连接。