我有两个访问表:用户和分数 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();
所以我不知道我在这里做错了什么。我应该这样做吗?我可能以某种方式在插入内部加入用户和得分表吗?
答案 0 :(得分:2)
如果您不介意稍微更改一下查询,则以下内容应该有效:
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();