2

我有一个应用程序,我需要从表中删除一行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)?

4

1 回答 1

1

IMO 你应该避免使用on delete cascade,因为:

  1. 您无法控制要删除的内容
  2. 必须更改表引用才能启用它
  3. 使用参数化查询(如所有建议)

因此,让我们更改您的查询。我添加了ClientOrder作为示例表,其中包含对我们即将删除的客户端的外键引用。首先,我删除了与客户相关的所有订单,然后我删除了客户本身。对于与表链接的所有其他表,这应该是这样的Client

public void Delete_Client(int _id_client)
{
    Data.Connect();

    using (Data.connexion)
    {
        string query = "delete from ClientOrder where id_client = @clientId; delete From CLIENT where id_client = @clientid";

        SqlCommand command = new SqlCommand(query, Data.connexion);
        command.Parameters.AddWithValue("@clientId", _id_client);

        try
        {
            command.ExecuteNonQuery();
        }
        catch { } //silencing errors is wrong, if something goes wrong you should handle it 
    }
}

参数化查询有很多优点。首先它更安全(查看 SQL 注入攻击)。第二种类型由框架解析(特别有助于DateTime格式化)。

于 2013-06-19T13:05:36.260 回答