使用 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 中的重复项

如何从 MySQL 中的多个表中删除?

在C#中使用SQL语句查询数据在表中是不是存在输出是或否

如何使用 c# 从 Microsoft Access 表中删除一行

sql多表查询出来的数据在C#中用啥装载比较好,是泛型集合还是集合??还有其他的可以装吗??