在 Asp.NET 中返回“语法错误”的有效 SQL 语句

Posted

技术标签:

【中文标题】在 Asp.NET 中返回“语法错误”的有效 SQL 语句【英文标题】:Valid SQL Statement Returning 'Syntax Error" in Asp.NET 【发布时间】:2014-11-18 03:27:07 【问题描述】:

我正在制作一个 ASP.Net Web 应用程序,但每当我尝试加载页面时它都会返回语法错误。

我的数据库架构可以在这里看到http://sqlfiddle.com/#!2/739c4/7

这是 SQL 查询:

SELECT
    tblOrderTransactions.ordertransaction_orderid AS orderid,
    tblProducts.product_name AS productname,
    tblOrders.order_customer AS ordercustomer
FROM
    tblProducts 
    LEFT JOIN tblOrderTransactions 
        ON tblProducts.product_id = tblOrderTransactions.ordertransaction_productid
    LEFT JOIN tblOrders
        ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_id
WHERE
    (
        (
            (
                tblOrderTransactions.ordertransaction_orderid
            )
            =3
        )
    ) and (
        (
            (tblOrders.order_customer)
            =3
        )
    )

SQL 在 sqlfiddle 中工作,如果我删除了上面写着的部分

LEFT JOIN tblOrders
   ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_id

在我的 Web 应用程序中,表格已加载。添加第二个 INNER JOIN 似乎搞砸了,但同样的查询在 sqlfiddle 中有效,所以我相信 SQL 是正确的。

我收到的错误信息是

查询表达式“tblProducts.product_id = tblOrderTransactions.ordertransaction_productid LEFT JOIN tblOrders ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_i”中存在语法错误(缺少运算符)。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.OleDb.OleDbException:查询表达式中的语法错误(缺少运算符)'tblProducts.product_id = tblOrderTransactions.ordertransaction_productid LEFT JOIN tblOrders ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_i'。

应用程序内的 C# 代码:

string orderID = Request.QueryString["id"];
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["finalConnString"].ConnectionString;
string commText = @"SELECT tblOrderTransactions.ordertransaction_orderid AS orderid, tblProducts.product_name AS productname 
                    FROM tblProducts 
                    LEFT JOIN tblOrderTransactions
                        ON tblProducts.product_id = tblOrderTransactions.ordertransaction_productid 
                    LEFT JOIN tblOrders
                      ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_id
                    WHERE (((tblOrderTransactions.ordertransaction_orderid)=?)) ";

    conn.Open();
    OleDbCommand comm = conn.CreateCommand();
    comm.Connection = conn;
    comm.CommandText = commText;

    OleDbParameter param;
    param = comm.CreateParameter();
    param.DbType = DbType.Int32;
    param.Direction = ParameterDirection.Input;
    param.Value = Int32.Parse(orderID);
    comm.Parameters.Add(param);

    //param = comm.CreateParameter();
    //param.DbType = DbType.Int32;
    //param.Direction = ParameterDirection.Input;
    //param.Value = Session["LoggedInId"];
    //comm.Parameters.Add(param);

    OleDbDataReader reader = comm.ExecuteReader();

    if (reader.HasRows)
    
        rptOrders.DataSource = reader;
        rptOrders.DataBind();
        lblOrderNumber.Text = orderID.ToString();
    
    else
    
        Response.Write("You are not authorized to view this order.");
    

//Free up the connection
conn.Close();

【问题讨论】:

您是按照小提琴中指定的方式针对 mysql 运行它,还是在本地使用其他数据库服务器? @MattiVirkkunen 我不太确定它运行在什么类型的 SQL 服务器上。它在生产中,所以它在我的机器上本地运行。正在从 mircosoft 访问 .accdb 文件中读取数据 @sirjustinwhite:那是你的问题,Access 似乎有一个奇怪的 JOIN 语法。看起来它需要额外的括号,但我不使用 Access(我认为没有人做过认真的工作)所以我不能确切地说出在哪里。在测试时,您还应该始终使用与生产环境相同类型的数据库服务器。 @MattiVirkkunen 我将研究访问特定的语法。谢谢你。我认为这将帮助我解决这个问题。我们只使用访问,因为它是用于一个类并且该类需要它。没想到能在sqlfiddle上切换db服务器类型! @MattiVirkkunen 好吧,你解决了。 Access 需要将连接嵌套在括号内才能工作。在正确的位置添加括号,它正在工作! 【参考方案1】:

由于 Access 特定的语法,SQL 语句必须将连接嵌套在括号中(感谢@MattiVirkkunen 提供的知识)。

这条SQL语句的正确写法是:

SELECT tblOrderTransactions.ordertransaction_orderid, tblProducts.product_name, tblOrders.order_customer FROM tblProducts INNER JOIN (tblOrders INNER JOIN tblOrderTransactions ON tblOrders.[order_id] = tblOrderTransactions.[ordertransaction_orderid]) ON tblProducts.[product_id] = tblOrderTransactions.[ordertransaction_productid] WHERE (((tblOrderTransactions.ordertransaction_orderid)=3)) and (((tblOrders.order_customer)=3))

【讨论】:

【参考方案2】:

首先,我建议使用别名以使您的查询更短一些,以便阅读(和输入),如下所示。

SELECT 
      OT.ordertransaction_orderid AS orderid, 
      P.product_name AS productname, 
      O.order_customer AS ordercustomer
   FROM 
      tblProducts P
         LEFT JOIN tblOrderTransactions OT
            ON P.product_id = OT.ordertransaction_productid
            LEFT JOIN tblOrders
               ON OT.ordertransaction_orderid = O.order_id
   WHERE 
          OT.ordertransaction_orderid = 3 
      and O.order_customer = 3

其次,它看起来确实完全合法,没有任何明显无效的地方。但是加载页面的错误可能是由于没有返回记录。您的查询带有左连接,但随后为“tblOrderTransactions”和“tblOrders”表添加 WHERE 子句会将其更改为 INNER JOIN 结果。

因此,您的查询查找订单 ID = 3 以及客户 = 3,如果不是这种情况,订单 #3 是客户 #1,这将导致 NO RECORDS。

回到现在看到您发布的语法,它看起来可能是问题的不平衡括号 ((( ))。

最后审查.. 查询字符串中的“ID”。它是否正确地对它执行 int.Parse() ?我知道在我过去做过的一些 int.parse() 实例中,如果字符串以空格与实际数字开头,则 int.Parse() 会抛出错误...确认传入的值并确实做到了按预期进行转换。

【讨论】:

他确实在他的问题中粘贴了异常,这是一个 SQL 错误:System.Data.OleDb.OleDbException: Syntax error (missing operator) in query expression 不,他的父母是平衡的。我查过了。 @MattiVirkkunen,那么当我看到它并且它是当前状态时,它一定是在编辑之间。有时过度使用括号也会导致问题,从而掩盖根本问题。

以上是关于在 Asp.NET 中返回“语法错误”的有效 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 中的 INSERT INTO 语句中的语法错误

ASP.NET MVC API 操作返回 404,所有其他操作都有效

查询表达式中的语法错误(缺少运算符) - ASP.NET

帮忙挑毛病 C# asp.net “语法错误 (操作符丢失) 在查询表达式''中”错误

使用 Html.Raw 将 ASP.NET 模型序列化为 JSON 的 Razor 语法错误

Asp.net mvc 应用程序在用户登录前抛出 js 语法错误