在 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,所有其他操作都有效
帮忙挑毛病 C# asp.net “语法错误 (操作符丢失) 在查询表达式''中”错误