我想用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 :(得分:4)
您只能从删除语句中的一个表中删除。
在事务中使用多个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;
}
}
答案 1 :(得分:1)
如果你想做类似的事情,你可以将所有表作为一个列表传递,并仍然做你想做的事。
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有适当的关系,你应该只需要删除主记录,它的孩子都会照顾好自己
答案 2 :(得分:0)
您无法从SQL Server中的一个语句中删除多个表。您将需要多个语句,每个表一个:
DELETE FROM user_data WHERE PersonID = '2';
DELETE FROM user_item WHERE PersonID = '2';
等等
单独关闭每一个,(确保不违反任何FK)或创建存储过程并关闭它(以最小化数据库连接的打开和关闭)。
我使用触发器的经验告诉我不要使用触发器,有时它们不应该触发它们!