使用 C# 命令从多个 SQL 表中删除
Posted
技术标签:
【中文标题】使用 C# 命令从多个 SQL 表中删除【英文标题】:Delete from multiple SQL tables with C# command 【发布时间】:2013-09-27 12:00:19 【问题描述】:我想,但总是出错:
“,”附近的语法无效。
这是目前为止的代码:
string connectionString = @"Data Source=" + System.IO.File.ReadAllText("Server.ini") + ";" + "Initial Catalog=" + "lin2world" + ";" + "User ID=" + System.IO.File.ReadAllText("User.ini") + ";" + "Password=" + System.IO.File.ReadAllText("Password.ini");
string sql = "DELETE FROM user_data, user_item, user_ActiveSkill, user_blocklist, user_deleted, user_friend, user_henna, user_history, user_log, user_macro, user_macroinfo, user_newbie, user_nobless, user_punish, user_recipe, user_skill, user_sociality, user_subjob WHERE char_id='" + textBox1.Text + "' ";
SqlConnection connection = new SqlConnection(connectionString);
SqlDataAdapter dataadapter = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
connection.Open();
dataadapter.Fill(ds, "char_id");
connection.Close();
MessageBox.Show("Character Deleted!!");
【问题讨论】:
SQL Server 没有语法可以在一个语句中从多个表中删除。 ***.com/questions/1714545/… 这不是 DELETE 的正确语法。看起来您甚至在任何地方都没有表名。 DELETE 用于从表中删除行;您是否尝试清除某些列中的值但将行保留在表中? 尝试将test' GO DROP TABLE user_data GO
放入textbox1
写一个存储过程清除表并调用它。另请查看参数化查询,这是一个 sql 注入向量 噩梦。
【参考方案1】:
您只能在删除语句中从一个表中删除。
在一个事务中使用多个删除语句来执行删除
如果您不熟悉 C# 中的事务,这里是一个示例
using (var Conn = new SqlConnection(_ConnectionString))
SqlTransaction trans = null;
try
Conn.Open();
trans = Conn.BeginTransaction();
using (SqlCommand Com = new SqlCommand(ComText, Conn, trans))
/* DB work */
trans.Commit();
catch (Exception Ex)
if (trans != null) trans.Rollback();
return -1;
【讨论】:
您还可以使用触发器:***.com/questions/9996643/… 或某种形式的级联删除(如果适用)。 级联删除在这里最有意义。 @Yablargo 我同意只有当表是真正的关系表时,由于我们不知道表结构,我们不能真正说 id 在其他表中设置为外键.【参考方案2】:如果你想做类似的事情,你可以将所有表作为一个列表传递,仍然可以做你想做的事情。
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name IN ("user_data","user_item","user_ActiveSkill","user_blocklist","user_deleted","user_friend","user_henna","user_history","user_log","user_macro","user_macroinfo","user_newbie","user_nobless","user_punish","user_recipe","user_skill","user_sociality","user_subjob") -- use these databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @name WHERE char_id='whatever'
FETCH NEXT FROM db_cursor INTO @name
END
编辑:似乎这些都是相关的表——如果你与 cascade:delete 有适当的关系,你应该只需要删除主记录,它的子记录都会自己处理
【讨论】:
【参考方案3】:您不能在 SQL Server 的一个语句中从多个表中删除。您将需要多个语句,每个表一个:
DELETE FROM user_data WHERE PersonID = '2';
DELETE FROM user_item WHERE PersonID = '2';
等等等等
然后单独触发每个,(确保不违反任何 FK)或创建一个存储过程并触发它(以最大限度地减少数据库连接的打开和关闭)。
我使用触发器的经验告诉我不要使用触发器,有时它们不会在应该触发的时候触发!
【讨论】:
以上是关于使用 C# 命令从多个 SQL 表中删除的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 WHERE 条件的单个查询 (SQL Express 2005) 从多个表中删除行
如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项