Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.NET中返回“语法错误”的有效SQL语句_C#_Sql_Asp.net_Ms Access - Fatal编程技术网

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

C# Asp.NET中返回“语法错误”的有效SQL语句,c#,sql,asp.net,ms-access,C#,Sql,Asp.net,Ms Access,我正在制作一个ASP.NETWeb应用程序,但每当我尝试加载页面时,它都会返回一个语法错误 我的数据库模式可以在这里看到 以下是SQL查询: SELECT tblOrderTransactions.ordertransaction_orderid AS orderid, tblProducts.product_name AS productname, tblOrders.order_customer AS ordercustomer FROM tblProduct

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

我的数据库模式可以在这里看到

以下是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在SQLFIDLE中工作,如果我删除

LEFT JOIN tblOrders
   ON tblOrderTransactions.ordertransaction_orderid = tblOrders.order_id
在我的web应用程序中,表是加载的。添加第二个内部连接似乎会把它搞砸,但同一个查询在SQLFIDLE中工作,所以我相信SQL是正确的

我收到的错误消息是

查询表达式“tblProducts.product\u id=tblOrderTransactions.ordertransaction\u productid LEFT JOIN tblOrderTransactions.ordertransaction\u orderid=tblOrders.order\u i”中缺少运算符的语法错误

描述:在执行当前web请求期间发生未经处理的异常。请查看堆栈跟踪,以了解有关错误及其在代码中起源的详细信息

异常详细信息:System.Data.OleDb.OLEDBEException:查询表达式“tblProducts.product\U id=tblOrderTransactions.ORDERTACTION\U productid LEFT JOIN tblOrderTransactions.ORDERTTRANSACTION\U ORDEID=tblOrders.order\U 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();

首先,我建议使用别名来缩短查询的阅读和键入时间,如下所示

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子句会将其更改为内部连接结果

因此,您的查询查找订单ID=3和客户ID=3,如果不是这样,那么订单3是客户1,这将导致没有记录

回到现在,看到您发布的语法,这看起来不平衡,这可能是问题所在


最后一次检查..您的ID来自查询字符串。它是否正确地对其执行int.Parse?我知道在我过去所做的int.Parse的一些实例中,如果字符串以空格和实际数字开头,int.Parse将抛出一个错误…确认传入的值,它是否真的按照您的预期进行了转换。

SQL语句由于访问特定的语法,st将连接嵌套在括号中。感谢@MattiVirkkunen的知识

编写此SQL语句的正确方法是:

选择tblOrderTransactions.ordertransaction\u orderid、tblProducts.product\u name、tblOrders.order\u customer 来自TBL产品 内连接主节点 内部连接tblOrderTransactions 在tblOrders上。[order\u id]=tblOrderTransactions。[ordertransaction\u orderid] 在tblProducts上。[product_id]=tblOrderTransactions。[ordertransaction_productid]
其中tblOrderTransactions.ordertransaction\u orderid=3和tblOrders.order\u customer=3

您是按照FIDLE中的指定对MySQL运行它,还是在本地使用另一台数据库服务器?@MattiVirkkunen我不太确定它运行在哪种类型的SQL server上。它正在生产中,因此它在本地我的机器上运行。数据正在从我是mircosoft access.accdbfile@sirjustinwhite:这是你的问题,Access似乎有一个奇怪的连接语法。它看起来需要额外的括号,但我不使用Access我以为没有人做过严肃的工作,所以我不能说确切的位置。在测试时,你也应该始终使用与生产中相同类型的数据库服务器。@MattiVirkkunen我将研究访问特定的语法。谢谢。我认为这将帮助我解决这个问题。我们只使用access,因为它是用于类的,并且类需要它。甚至没有想过能够在sqlfiddle上切换db服务器类型!@MattiVirkkunen好的,你解决了它。access需要嵌套连接为了起作用,在括号中添加了括号。在正确的位置添加了括号,它就起作用了!他确实在问题中粘贴了异常,这是一个SQL错误:System.Data.OleDb.OLEDBEException:语法错误查询表达式中缺少运算符Nope,他的参数是平衡的。我检查过了。@MattiVirkkunen,那么当我有时过度使用parens也会导致问题,使根本问题变得模糊。