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

时间:2013-12-24 21:04:50

标签: c# asp.net ms-access

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

所以我不知道我在这里做错了什么。我应该这样做吗?我可能以某种方式在插入内部加入用户和得分表吗?

1 个答案:

答案 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();