Sql 用Ado.net进行级联删除
我有一个应用程序,需要从表Sql 用Ado.net进行级联删除,sql,sql-server,ado.net,cascade,cascading-deletes,Sql,Sql Server,Ado.net,Cascade,Cascading Deletes,我有一个应用程序,需要从表Client public void Delete_Client(int _id_client) { Data.Connect(); using (Data.connexion) { string s = "Delete From CLIENT where id_client = " + _id_client; SqlC
Client
public void Delete_Client(int _id_client)
{
Data.Connect();
using (Data.connexion)
{
string s = "Delete From CLIENT where id_client = " + _id_client;
SqlCommand command = new SqlCommand(s, Data.connexion);
try
{
command.ExecuteNonQuery();
}
catch { }
}
}
表Client
包含对另一个表的外部引用。因此,出现一个异常,表明必须进行级联删除
因此,如何更改代码以实现此目的(我正在使用sql server作为dbms)?IMO您应该避免在删除级联时使用
,因为:
您将无法控制正在删除的内容
必须更改表引用以启用它
使用参数化查询(作为全面建议)
因此,让我们更改您的查询。我添加了ClientOrder
作为示例表,该表保存了我们即将删除的客户端的外键引用。
首先,我删除所有链接到客户端的订单,然后删除客户端本身。其他所有桌子都应该这样
与客户端
表链接的
public void Delete\u客户端(int\u id\u客户端)
{
Data.Connect();
使用(Data.connexion)
{
string query=“从客户端删除,其中id\u client=@clientId;从客户端删除,其中id\u client=@clientId”;
SqlCommand=newsqlcommand(query,Data.connexion);
command.Parameters.AddWithValue(“@clientId”,\u id\u client);
尝试
{
command.ExecuteNonQuery();
}
catch{}//沉默错误是错误的,如果出现问题,你应该处理它
}
}
参数化查询有许多优点。首先,它更安全(看看SQL注入攻击)。第二种类型由框架解析(特别有助于格式化DateTime
)