从C#中使用子查询访问数据库INSERT

我有两个访问表:用户和分数.

Users表有列:id(自动增量用户ID),用户名,密码 – id是主键

分数表包含列:id(来自用户的用户ID),highScore – 没有主键

在C#方法中,我将用户名和分数作为参数,我想插入分数表,以便在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);";

这会通过,但结果行为空.所以我基本上得到一个非空的空行.

我绝对肯定参数包含在命令执行之前添加的值.

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();
点赞