我有两个访问表:用户和分数.
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();