我有两个 Access 表:用户和分数。
用户表包含列:id(自动递增用户 id)、用户名、密码 - id 是主键
分数表有列:id(来自用户的用户 ID),highScore - 没有主键
在 C# 方法中,我将 username 和 score 作为参数,我想插入到 scores 表中,以便在 id 字段中是用户名与提供的用户名匹配的用户的 id。
到目前为止,我尝试过的命令是:
string insertCommand = @"INSERT INTO scores([id], [highScore])
VALUES((SELECT id FROM users WHERE username = @username), @score);";
这会抛出:查询输入必须包含至少一个表或查询。
所以在四处寻找之后,我发现 Access DB 与通常的 SQL 有点不同,所以我尝试使用 DLookup:
string insertCommand = @"INSERT INTO scores([id], [highScore])
VALUES(DLookup(""id"", ""users"", ""username = '@username'""), @score);";
这通过了,但是结果行是空的。所以我基本上得到一个不为 NULL 的空行。
我绝对确定参数包含在命令执行之前添加的值。
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@score", points);
command.CommandText = insertCommand;
command.ExecuteNonQuery();
所以我不知道我在这里做错了什么。我什至应该这样做吗?我能否以某种方式加入插入内容中的用户和分数表?
最佳答案
如果您不介意稍微更改一下查询,以下应该可行:
string insertCommand = @"INSERT INTO scores (id, highscore)
SELECT id, @highScore FROM users WHERE username = ?;";
这是我在测试中使用的代码块:
var highScore = 99;
var username = "johndoe";
OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString());
string insertCommand = @"INSERT INTO scores (id, highscore)
SELECT id, @highScore FROM users WHERE username = @username;";
OleDbCommand cmd = new OleDbCommand(insertCommand, con);
cmd.Parameters.AddWithValue("@highScore", highScore);
cmd.Parameters.AddWithValue("@username", username);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
关于c# - 使用 C# 中的子查询 Access 数据库 INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20766717/