你的问题在SQL Statement,它是无效的。
你应该把语句分成两个:
先删除Comments,再删除Posts
顺序很重要
var deleteComments = new SqlCommand("DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = @PostId;");
deleteComments.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(deleteComments);
var deletePosts = new SqlCommand("DELETE Posts WHERE PostId= @PostId;");
deletePosts.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(deletePosts);
另一种选择,使用一个语句:
var delete = new SqlCommand("DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = @PostId; DELETE Posts WHERE PostId= @PostId;");
delete.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(delete);
更多解释:
通过 SQL Studio (SSMS) 使用以下准备好的 SQL 脚本:
CREATE TABLE Posts (PostId INT, PostText varchar(20))
CREATE TABLE Comments (CommentId INT, PostId INT, CommentText varchar(20))
INSERT INTO Posts VALUES (1, 'text')
INSERT INTO Comments VALUES (1,1, 'comment here')
当我运行你的 DELETE 语句时
DELETE Posts, Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = 1
它给了我同样的错误
当我跑步时
DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = 1;
DELETE Posts WHERE PostId = 1;
效果很好。
所以经验法则在这种情况下是先使用SSMS (MS SQL Studio)来测试你的SQL语句然后执行它在 C# 中。