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

时间:2014-11-18 03:27:07

标签: c# sql asp.net ms-access

我正在创建一个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();

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

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"输入WHERE子句。和" tblOrders"表将其更改为INNER JOIN结果。

因此,您的查询查找订单ID = 3以及客户= 3,如果不是这样,那么订单#3是客户#1,这将导致无记录。

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

最后的审核..你的" ID"来自查询字符串。它是否正确地对它执行int.Parse()?我知道在过去我做过的int.parse()的一些实例,如果字符串以空格vs实际数字开头,int.Parse()会抛出错误...确认传入的值并做了它真的像你期望的那样转换。