使用C#命令从多个SQL表中删除数据

14 浏览
0 Comments

使用C#命令从多个SQL表中删除数据

我想用C#命令从多个SQL表中删除数据,但是我总是遇到错误:

“无效的语法,附近有“,”。”

以下是目前的代码: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!!");

0
0 Comments

在SQL Server中,你不能在一条语句中从多个表中删除数据。你需要为每个表编写单独的语句:

DELETE FROM user_data WHERE PersonID = '2';
DELETE FROM user_item WHERE PersonID = '2';

等等

然后分别执行每个语句(确保不违反任何外键约束),或者创建一个存储过程并执行它(以最小化打开和关闭数据库连接的次数)。

根据我的经验,我不建议使用触发器,有时它们不会在应该触发时触发!

0
0 Comments

问题的出现原因:

这段代码中出现了一个错误,导致无法成功执行删除操作。具体原因是在DELETE语句中缺少表名,导致无法确定要删除的表。

解决方法:

要解决这个问题,需要修改DELETE语句中的表名。根据代码中的注释可以看出,要删除的表名应该是在一个包含了多个表名的列表中选择。因此,可以使用FOR循环来遍历这个列表,并在每一次循环中执行DELETE语句。在每一次循环中,将当前循环到的表名作为DELETE语句的表名。

修正后的代码如下:

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 @table_name
WHILE @@FETCH_STATUS = 0   
BEGIN   
    DECLARE @delete_query NVARCHAR(MAX)
    SET @delete_query = 'DELETE FROM ' + QUOTENAME(@table_name) + ' WHERE char_id=''whatever'''
    EXEC sp_executesql @delete_query
    FETCH NEXT FROM db_cursor INTO @table_name
END   
CLOSE db_cursor
DEALLOCATE db_cursor

修改后的代码中,通过将表名存储在一个变量中,并在每一次循环中使用这个变量来构建DELETE语句。同时,使用QUOTENAME函数来确保表名的安全性,并使用sp_executesql函数来执行动态生成的DELETE语句。

另外,这段代码中还提到了如果数据库中的表之间存在合适的关联关系,可以使用级联删除的方式来删除记录。这种情况下,只需要删除主记录,相关的子记录会自动被删除。

0
0 Comments

问题的出现原因是在一个删除语句中只能删除一个表。为了解决这个问题,可以在事务中使用多个删除语句进行删除操作。以下是在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;
    }
}

如果适用的话,还可以使用触发器或级联删除来解决这个问题。在这种情况下,级联删除可能是最合适的选择。然而,我们无法确定表的结构是否确实设置了外键,所以无法确定是否适合使用级联删除。

0