C# Asp.NET中返回“语法错误”的有效SQL语句
我正在制作一个ASP.NETWeb应用程序,但每当我尝试加载页面时,它都会返回一个语法错误 我的数据库模式可以在这里看到 以下是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
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也会导致问题,使根本问题变得模糊。