【问题标题】:Why does try catch not catch Sql syntax error为什么try catch not catch Sql语法错误
【发布时间】:2012-01-06 21:11:16
【问题描述】:

我正在向我的站点添加一个输入框,作为管理员,我可以在其中输入 sql select 语句,我在执行 select 的代码周围放置了一个 try catch 以尝试捕获语法错误,但即使这样,我的站点也会转到出现语法错误时的“应用程序错误/”页面。

我不明白我做错了什么。我正在 Asp.net v4 上开发。

执行自定义SQL命令的代码如下;

 try
 {
      //edtSQL.Text = "WHRE Field='Value'"
      //The Resulting SQL Command will be incorrect because of incorrect syntax
      SqlDataSource1.SelectCommand = "SELECT * FROM DataTable " + edtSQL.Text;
      SqlDataSource1.Select(new DataSourceSelectArguments());
 }
 catch(Exception ex)
 {
       //Bad Syntax should be caught here, but it is not. This never get called
       // even when there is a syntax error.
       lblQueryStatus.Text = "Error, can't execute SQL statment";
 }

如果标签显示错误消息,则站点会给出错误并转到默认站点错误页面。

【问题讨论】:

  • 你能提供你的代码,特别是你的按钮点击处理程序/
  • 您确定没有在其他地方抛出异常吗?您是捕获所有异常还是仅捕获SqlExceptions?
  • 请发布您的相关代码。你预计会发生什么?
  • @KeaganLadds:我已经重新打开,以便您可以添加详细说明解决方案的答案。然后,您可以选择它作为正确答案并关闭此问题。感谢您改进您的问题!

标签: asp.net sql


【解决方案1】:

上面代码中的catch确实捕获了异常。在例外情况下,将“选择命令”设置为可以正常工作的默认值,即。

SELECT * FROM Database

然后执行选择。这样做的原因是,当页面回发时,它会尝试执行为其设置的 select 语句,并且没有 try catch 围绕这个(因为它在另一个上下文中),这就是为什么服务器然后默认为“应用程序/”页面中的错误。

代码应该是这样的

try
{
  //edtSQL.Text = "WHRE Field='Value'"
  //The Resulting SQL Command will be incorrect because of incorrect syntax
  SqlDataSource1.SelectCommand = "SELECT * FROM DataTable " + edtSQL.Text;
  SqlDataSource1.Select(new DataSourceSelectArguments());
}
catch(Exception ex)
{
   SqlDataSource1.SelectCommand = "SELECT * FROM DataTable"; //This will work for sure
   SqlDataSource1.Select(new DataSourceSelectArguments());
   lblQueryStatus.Text = "Error, can't execute SQL statment";
} 

【讨论】:

  • 附带说明,您绝对应该使用 SqlParameters; "SELECT * FROM DataTable " + edtSQL.Text; 让您对注入攻击敞开大门。
  • 谢谢。我会研究如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多