最近在我一直在开发的应用程序中,我一直在检查受数据库插入、更新、删除影响的行数,并在数量意外时记录错误。例如,如果从 ExecuteNonQuery() 调用返回的行数不是 1 行,则对一行进行简单的插入、更新或删除,我将认为这是一个错误并记录它。此外,我现在在键入此内容时意识到,如果发生这种情况,我什至不会尝试回滚事务,这不是最佳实践,绝对应该解决。无论如何,这里的代码来说明我的意思:
我将有一个数据层函数来调用数据库:
public static int DLInsert(Person person)
{
Database db = DatabaseFactory.CreateDatabase("dbConnString");
using (DbCommand dbCommand = db.GetStoredProcCommand("dbo.Insert_Person"))
{
db.AddInParameter(dbCommand, "@FirstName", DbType.Byte, person.FirstName);
db.AddInParameter(dbCommand, "@LastName", DbType.String, person.LastName);
db.AddInParameter(dbCommand, "@Address", DbType.Boolean, person.Address);
return db.ExecuteNonQuery(dbCommand);
}
}
然后是业务层调用数据层函数:
public static bool BLInsert(Person person)
{
if (DLInsert(campusRating) != 1)
{
// log exception
return false;
}
return true;
}
在代码隐藏或视图中(我同时做 webforms 和 mvc 项目):
if (BLInsert(person))
{
// carry on as normal with whatever other code after successful insert
}
else
{
// throw an exception that directs the user to one of my custom error pages
}
我使用这种类型的代码越多,我就越觉得它是矫枉过正的。特别是在代码隐藏/视图中。是否有任何正当理由认为简单的插入、更新或删除实际上不会修改数据库中正确的行数?只担心捕获实际的 SqlException 然后处理它,而不是每次都对受影响的行进行单调检查是否更合理?
谢谢。希望大家能帮帮我。
更新
感谢大家花时间回答。我还没有 100% 决定今后将使用什么设置,但这是我从您的所有回复中得出的结论。
- 相信 DB 和 .Net 库可以处理查询并按照设计的方式完成工作。
- 在我的存储过程中使用事务来回滚任何错误的查询,并可能用于
raiseerror
将这些异常作为 SqlException 抛出回 .Net 代码,它可以通过 try/catch 处理这些错误。这种方法将取代有问题的返回码检查。
我遗漏的第二个要点会有什么问题吗?