C# - 针对不影响任何行的Access数据库的复杂DELETE语句

时间:2015-05-28 16:06:07

标签: c# ms-access

这似乎对我来说非常基本,但它似乎并不想工作。

我试图根据子查询返回的记录从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;
        }
    }

调试时我确定应该删除六行,但实际上没有删除。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

使用OleDb和Access,将忽略参数名称。您必须按db引擎期望的顺序提供参数值。在您的查询中,Access在 @pID 的值之前需要 @nightID 的值。

所以交换这些参数行......

cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@nightID", NightID);
cmd.Parameters.AddWithValue("@pID", PlayerID);
cmd.Connection = conn;