我正在为电影院写一个c#节目。如果电影已完全预订,该程序将把用户移动到等待列表。如果有人取消了电影的预订,那么等候名单的最高人将自动移动到预订列表
我已经编写了部件代码,如果已满,可以将用户移动到等待列表中,并且可以正常工作。 现在我陷入了从等待列表中选择最高用户并将其移动到预订列表的部分。并从等候名单中删除该人的记录
这是我的sql,用于从等待到预订。
"frameworks": {
"net461": {}
}
这个sql删除那个人。
string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID=)" + mID+ " (ORDER BY R_Date ASC)";
我的其他函数在编译和运行程序时运行良好且没有错误。所以我认为,我的SQL必定存在问题。请帮我谢谢。
答案 0 :(得分:2)
这是不正确的语法:
INSERT INTO reserve (ID,M_ID,R_Date)
VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID= . . .
我想你打算:
INSERT INTO reserve (ID,M_ID,R_Date)
SELECT TOP 1 ID, M_ID, R_Date
FROM Wait WHERE M_ID = . . .;
列名称周围的两个括号都是错误的,因为从select
到values
子句返回多个值。
我应该补充一点,由于潜在的时间冲突,你正在做的事情似乎不安全。您应该调查OUTPUT
子句。一种方法是从wait
中删除记录,将其放在临时表中,然后插入reserve
。
答案 1 :(得分:1)
您需要进行交易以确保安全,但这些调整可能有效:
string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) "
+ " SELECT TOP 1 (ID,M_ID,R_Date) "
+ " FROM Wait WHERE M_ID=" + mID + " "
+ " ORDER BY R_Date ASC";
然后删除:
string myQry = "DELETE FROM Wait WHERE ID IN "
+ " (SELECT TOP 1 ID FROM Wait WHERE M_ID =" + mID + " "
+ " ORDER BY R_Date ASC)";
注意:最好将Wait
表上的自动增量ID检索到变量中,然后将其用于插入和删除查询,但我不确定您使用的是哪个SQL Server API写一个检索选定值的例子。
PS - 如果ID
是用户ID(似乎很可能),您可能希望将其重命名为user_ID
。此外,最好在Wait
表中使用自动增量ID来识别一行。
答案 2 :(得分:1)
可能像
DELETE TOP (1) FROM Wait WHERE M_ID = mid
此处的订单也可能有用。
答案 3 :(得分:0)
你有多余的括号:
... WHERE M_ID = " + mid + " ORDER BY R_Date ASC)";