使用C#命令从多个SQL表中删除数据
使用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!!");
问题的出现原因:
这段代码中出现了一个错误,导致无法成功执行删除操作。具体原因是在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语句。
另外,这段代码中还提到了如果数据库中的表之间存在合适的关联关系,可以使用级联删除的方式来删除记录。这种情况下,只需要删除主记录,相关的子记录会自动被删除。
问题的出现原因是在一个删除语句中只能删除一个表。为了解决这个问题,可以在事务中使用多个删除语句进行删除操作。以下是在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; } }
如果适用的话,还可以使用触发器或级联删除来解决这个问题。在这种情况下,级联删除可能是最合适的选择。然而,我们无法确定表的结构是否确实设置了外键,所以无法确定是否适合使用级联删除。