查询表达式“@ID = @@IDENTITY”中的语法错误(缺少运算符)
Posted
技术标签:
【中文标题】查询表达式“@ID = @@IDENTITY”中的语法错误(缺少运算符)【英文标题】:Syntax error (missing operator) in query expression '@ID = @@IDENTITY' 【发布时间】:2013-03-25 22:44:24 【问题描述】:here 给了我宝贵的建议
但正如主题标题所说,我在 btnLogin 方法中收到错误,这与我之前的问题有关,但我认为确实是同样的问题?我这样说是因为我没有从我以前的问题中得到错误。如果有人可以在这里帮助我,请提前致谢。
访问 2003 VS 2010 c#
这是我的 btnLogin 方法
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)";
cmd.CommandText = "SELECT @ID = @@IDENTITY";
cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
cmd.Parameters.AddWithValue("@LoggedInDate", DateTime.Now.ToShortDateString());
cmd.Parameters.AddWithValue("@LoggedInTime", DateTime.Now.ToString("HH:mm"));
cmd.Connection = myCon;
myCon.Open();
cmd.ExecuteNonQuery();
myCon.Close();
这是我的 btnLogOut 方法。
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = ?, [LoggedOutTime] = ? WHERE ID = @ID";
cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString());
cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm"));
cmd.Connection = myCon;
myCon.Open();
cmd.ExecuteNonQuery();
代码的目的是记录用户登录的日期和时间以及用户退出的日期和时间。
更新 2 这个我也试过了...
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)" + "SELECT @ID = @@IDENTITY";
然后我收到错误...
SQL 语句末尾缺少分号 (;)。
更新 3
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES
(@UserName, @LoggedInDate, @LoggedInTime)"; "SELECT @ID = @@IDENTITY";
我放了一个;我得到了错误......
只有赋值、调用、递增、递减和新对象表达式可以作为语句使用
查看其他解决方案提供给我的其他成员
更新 4
我认为这里的一些建议可能只适用于 SQL Server。我正在使用 MS Access 2003。
更新 5
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES
(@UserName, @LoggedInDate, @LoggedInTime); SELECT @ID = @@IDENTITY";
接收错误...
在 SQL 语句结束后找到的字符。
【问题讨论】:
但是你想用第二个语句做什么?您不会在任何地方读回该值(@ID)
。
您针对哪个版本的 SQL Server 运行此程序?为什么你的标签中有 ms-access?
我正在使用 MS ACCESS - 我想也许有 SQL Server 知识的人可以帮助我,换句话说,扩大标签以达到更远的领域
【参考方案1】:
看来您的代码可能有错误。您将 cmd 的 Text 设置为第一行,然后将其完全替换为第二行:
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)";
cmd.CommandText = "SELECT @ID = @@IDENTITY";
所以你实际上只是在执行:
cmd.CommandText = "SELECT @ID = @@IDENTITY";
【讨论】:
感谢您的快速回复,如果您不介意可以看看我的更新吗? @bucketblast 然后在第一条语句的末尾添加;
。提示:在@LoggedInTime)
之后。
@bucketblast DaveShaw 打算将其包含在您的 SQL 语句中:cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime); SELECT @ID = @@IDENTITY"
@MartinParkin - 接收错误 - 在 SQL 语句结束后发现字符。我会在顶部更新
@bucketblast 如果您使用的是 MS Access,您需要将 INSERT
和 SELECT @ID = @@IDENTITY
语句作为两个单独的命令依次执行。您不能在针对 MS Access 的同一语句中执行它们。 @@IDENTITY
将保留在连接对象中,因此您不会丢失它。【参考方案2】:
在第一个登录方法中,您通过设置两次来覆盖命令文本:
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)";
cmd.CommandText = "SELECT @ID = @@IDENTITY";
在“更新 2”中,您在 INSERT 语句之后连接 SELECT 语句,从而产生以下 SQL:
INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)SELECT @ID = @@IDENTITY
你必须设置一个';'在 INSERT 语句的末尾,在 'SELECT' 之前。
顺便说一句。使用 SCOPE_IDENTITY(),而不是 @@IDENTITY,请参阅 http://msdn.microsoft.com/en-us/library/ms190315.aspx 和 SQL: How to get the id of values I just INSERTed?
另外,这里有一个类似的问题,显示了执行命令的正确方法: How to get last inserted id?
【讨论】:
哦,我错过了访问部分。不,我不这么认为:-) 没关系。我要回到原来的计划。也就是说,当用户注销时,日期和时间将记录到新的 ID(自动编号)。似乎 MS-Access 和 C# 仅适用于基础知识。【参考方案3】:如果您正在考虑获取用户 ID,则必须将两个语句合并到一个批次中
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime) SELECT @@IDENTITY";
【讨论】:
TrustyCoder - 我完成了@LoggedInTime);选择但出现错误以上是关于查询表达式“@ID = @@IDENTITY”中的语法错误(缺少运算符)的主要内容,如果未能解决你的问题,请参考以下文章
论文解读(ID-MixGCL)《ID-MixGCL: Identity Mixup for Graph Contrastive Learning》