这似乎对我来说非常基本,但它似乎并不想工作。
我试图根据子查询返回的记录从Access数据库表中删除行。我不确定它是否是语法问题或可能出现的问题 - 我尝试了多个版本。无论我尝试哪个版本,结果都是语法错误或没有行受到影响。
这是我的最新代码,它不会返回错误:
public bool DeletePlayerGamesRecords(int PlayerID, int NightID)
{
PinnacleConnection pcon = new PinnacleConnection();
OleDbConnection conn = pcon.createConnection();
OleDbCommand cmd = new OleDbCommand();
string sql = "DELETE * FROM tblPlayerGames WHERE fk_player_id = @pID AND fk_game_id IN (SELECT tblGames.[ID] FROM tblGames WHERE fk_night_id = @nightID)";
try
{
conn.Open();
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@pID", PlayerID);
cmd.Parameters.AddWithValue("@nightID", NightID);
cmd.Connection = conn;
int affected = cmd.ExecuteNonQuery(); //affected rows always 0!
conn.Close();
return true;
}
catch (Exception ex)
{
this.error = ex.Message;
return false;
}
}
调试时我确定应该删除六行,但实际上没有删除。
我做错了什么?
答案 0 :(得分:2)
使用OleDb和Access,将忽略参数名称。您必须按db引擎期望的顺序提供参数值。在您的查询中,Access在 @pID 的值之前需要 @nightID 的值。
所以交换这些参数行......
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@nightID", NightID);
cmd.Parameters.AddWithValue("@pID", PlayerID);
cmd.Connection = conn;