2011-08-17 61 views
1

这够好吗?我需要添加任何东西或删除任何东西吗?像回滚到我的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(); } 
    } 

回答

2

您没有正确使用usingusing的想法是包装一些资源,需要在安全西方发布,以防止异常。因此,使用using(哈哈)的正确方法是:

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

的第二个问题是,你执行你的查询,就好像它应该返回标量值。这是确定的,但我认为这是更好地利用刚刚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 
} 
+0

完美的谢谢你和我的ExcuteScalar是一个错误,谢谢你..但这个部分如何“,我怎么让演示层知道该函数的代码执行没有错误..应该让它的书而不是无效或什么?“ !? – lKashef

+0

最简单的方法是将返回值类型更改为bool。如果你需要的不仅仅是成功/失败,你可以引入一些'Enum'。如果你需要从函数中返回一些数据,你可以通过返回null来区分成功和失败。但就你而言,我只是返回true/false。 – J0HN

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

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

+0

这只是关于处置..我担心发生任何错误。我不想让用户看到错误! – lKashef

+0

虽然连接在使用之外被初始化并且在使用之前有语句,理论上在使用块被输入之前可能会有异常。最好在使用语句中进行初始化。 –

0

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

+0

嗯,但我需要终于阻止!无论如何,我正在做Try-Catch-Finally错误的方式,我现在得到了提示,我将编辑它..但关于放置connection.Open();一开始我只是想我会添加我的命令,然后打开连接,这样我就可以最小化连接打开的时间了。您怎么看? – lKashef

+0

我通常在*最后可能的时刻*做connection.open,所以我认为OP正确地做了这个部分。 (在运行时什么'验证与服务器的连接'是什么意思?)对using()虽然有很好的建议。 – Chains

+0

我没有明白! ..在最后一步打开连接可以吗? – lKashef

1

,我怎么可以让表示层知道该函数的代码是没有错误的执行?

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

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

编辑:当我说“那么扔到前端的例外是完全正常的”,我的意思是 - 把它扔到前端,但有前端处理它的优雅!

+0

+1谢谢丹尼尔 – lKashef

相关问题