我正在创建一个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();
答案 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()会抛出错误...确认传入的值并做了它真的像你期望的那样转换。