这够好吗?我需要添加任何内容或删除任何内容吗?像回滚到我的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(); }
}
答案 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)
您没有正确使用using
。 using
的想法是包装一些需要在安全西方发布的资源,以保护它免受异常的影响。因此,使用using
(ha-ha)的正确方法如下:
using(SqlConnection connection = new SqlConnection(ConnectionString)){
{
using(SqlCommand command = new SqlCommand(commandText, connection)){
//your code here
}
}
第二个问题是您正在执行查询,就好像它应该返回Scalar值一样。没关系,但我认为最好只使用Execute
:command.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()通常放在开头 - 以验证与服务器的连接。