【发布时间】:2019-11-01 04:00:31
【问题描述】:
我有一个 SQL 语句来检查一个值是否在我的数据库中。如果数据库中的值是 not,我想用“快乐路径”来响应。 我发现使用 DbDataReader (.NET) 如果 SELECT 查询找不到它会引发异常的值 - 所以我的“快乐路径”最终出现在异常中,而不是在主 try 块中。
我总是可以说“NOT IN”,但我不想返回数据库中没有值的所有行 - 因为这会返回数千个结果,而我想要的只是一个“不,它不在这里”类型的响应。
public void wristbandScan(string barcode)
{
string query = "SELECT ticket FROM tickets WHERE
linked_barcode='" + barcode + "'";
ValidTicketEventArgs args = new ValidTicketEventArgs();
try
{
var queryResult = _dbRunner.queryThis(query);
args.Result = false;
args.Message = "WB already linked";
args.Barcode = barcode;
OnValidTicketEvent(args);
}
catch (Exception e)
{
this.updateWristband(barcode);
this.updateValid();
args.Result = true;
args.Message = "WB linked";
args.Barcode = barcode;
OnValidTicketEvent(args);
}
}
在错误语句中捕捉快乐路径对我来说是错误的,但我不希望与使用 NOT IN 语句读取所有行相关的延迟。
有没有更好的方法来做到这一点,或者这种方法是可接受的最佳实践?
【问题讨论】:
-
是的,非常糟糕的做法。例外非常昂贵,应该只是:例外,不是你期望发生的事情,更不用说“快乐”的结果了!
-
这是我的想法。那么如何让 SELECT 语句在找不到值时不返回异常呢?也许限制是我对 SQL 的了解?
-
通常情况下,如果 SELECT 查询找不到它会引发异常的值 嗯?在什么情况下是真的??通常,查询返回一个空的结果集。
_dbRunner.queryThis是什么?? -
最好从像实体框架这样的 ORM(对象到关系管理器)开始(其他选项可用),此时您可以将表视为对象的集合,而不必担心底层 SQL 代码。它还可以消除您当前代码可能遭受的 SQL 注入攻击。
-
我不知道为什么
SELECT如果没有找到结果会抛出异常,它应该返回一个空集。但是,如果您只关心条形码的存在,您可以将查询更改为COUNT(1) FROM tickets WHERE linked_barcode=<value>。如果未找到匹配项,则返回 0,否则将返回大于 0 的值
标签: c# sql error-handling try-catch