首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子查询访问数据库更新表

使用子查询访问数据库更新表
EN

Stack Overflow用户
提问于 2013-12-26 00:01:10
回答 1查看 279关注 0票数 0

我从来没有想过知道mySQL,我使用Access是安全的。

我有两个表: users和scores表包含:id(自动增量主键)、用户名、密码等。scoers表包含:id(数字-users.id的外键),highScore

我以前曾请求过INSERT命令的帮助,现在它可以正常工作了。现在,我在使用类似的UPDATE命令时遇到了问题。

不工作的命令如下所示:

代码语言:javascript
复制
string updateCommand = @"UPDATE scores
                         SET
                         id = (SELECT id FROM users WHERE username = @username),
                         highScore = @score
                         WHERE highScore = (SELECT MIN(highScore) FROM scores);";

它抛出一个:Operation must use an updateable query.

为了使我在这里尝试完成的事情变得合理:我在表中插入高分,直到我在表中达到10分,之后,我决定使用UPDATE来“覆盖”当前最低分,而不是添加任何新的分数并不必要地填充数据库。

我得到了一个用户名和最高分数,因为scores表只包含id,所以我需要找到当前用户的id,这就是第一个子查询要做的事情,WHERE子句中的第二个子查询是指定要替换哪个分数(尽管如果有多个人的分数最低,这里可能会有一个bug,您知道如何解决这个问题吗?)

我还尝试使用外部右连接,如下所示:

代码语言:javascript
复制
string updateCommand = @"UPDATE scores
                            OUTER RIGHT JOIN users ON scores.id = users.id
                            SET
                            scores.id = users.id,
                            scores.highScore = @score
                            WHERE (highScore = (SELECT MIN(highScore) FROM scores)) AND (username = @username);";

没有运气(我得到了一个通用的Syntax error in UPDATE statement.)。

浏览网络,我发现我可能“不能”在UPDATE语句中使用子查询,但我似乎在这个问题上找到了相互矛盾的观点。

我还尝试使用DLookup函数来代替如下所示的子查询:

代码语言:javascript
复制
@"...
id = DLookup(""id"", ""users"", ""username = @username""),
...
WHERE highScore = DLookup(""MIN(highScore)"", ""scores"");";

省略号表示与上述代码相同的无关代码。

此外,作为最后的手段,我尝试将userId查询分成多个查询,如下所示:

代码语言:javascript
复制
string userIdQuery = "SELECT id FROM users WHERE username = @username"

从我收到的NullReferenceException (Object reference not set to an instance of an object.)判断,当我尝试使用变量userId时,似乎返回了一个null:

代码语言:javascript
复制
int userId = 0;
userId = (Int32)command.ExecuteScalar();

我应该得到一个整数,但我想我得到的是null。获得最小最高分的几乎相同的查询完美地工作,int变量填充了正确的值,所以我假设问题出在查询本身。我曾尝试在@username参数两边添加单引号,假设它可能无法识别字符串,但似乎不是这样。

呼..。写这篇文章花了我一段时间。有没有人有什么办法让这一切都正常工作?如果您需要更多信息,请让我知道。

EN

回答 1

Stack Overflow用户

发布于 2013-12-27 02:59:20

所以,经过一番折腾之后,我终于找到了问题的原因。不好的一面是我增加了代码量,以便尽可能避免子查询,因为至少从我的经验来看,Access并不喜欢在UPDATEINSERT命令中使用子查询。

我首先做的是将命令分成3个独立的命令:

  • "SELECT id FROM users WHERE username = ?;" -获取用户的id,我将其分数放在database.
  • @"SELECT scores.id, scores.highScore, scores.dateTime FROM scores WHERE (((scores.highScore)=DMin(""highScore"",""scores"")));"中-它获取id、最高分数和条目被...输入得很好,目前在高分列表中是最低分。多亏了HansUp的建议,我使用了DMin函数,而不是带有MIN的子查询,以避免Must use an updateable query错误。无关的括号是由Access造成的,因为此命令是由Access查询设计器生成的,我不敢更改任何内容,以免破坏it.
  • @"UPDATE scores SET scores.id = ?, scores.highScore = ?, scores.[dateTime] = Now() WHERE (((scores.id)=?) AND ((scores.highScore)=?) AND ((scores.dateTime)=?));" - update命令本身,这里没有什么可说的,除了它获取先前提取的数据并将其用作命令的值之外。

我注意到的一件事是,即使我让命令正常工作,.ExecuteNonQuery()也总是返回0行受影响。在仔细研究之后,我发现ASP.NET / C#中命令的命名参数并不总是有效的,应该改为使用?。这有点不方便,但我不能抱怨太多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20774544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档