从 sql 数据库中删除数据不起作用

本文关键字:数据 不起作用 删除 sql 数据库 | 更新日期: 2023-09-27 18:19:05

从列表框中选择项目时,要删除选定的项目。为什么从数据库中删除所选数据时它不起作用?我一定错过了什么。我收到错误消息对象类型不存在映射。

这是一个方法参数:

  IsDelete = _dinnerRemover.RemoveDinners(lstDinner.SelectedItems);

此类用于从数据库中删除数据

public bool RemoveDinners(dynamic dinnerItems)
{
    Dinners = new List<FoodInformation>();
    using (var sqlConn = new SqlConnection(_sqlConnectionString))
    {
        const string sqlQuery = "delete from DinnerTemplates where Dinner = @dinner";
        using (var command = new SqlCommand(sqlQuery, sqlConn))
        {
            try
            {
                //command.CommandType = CommandType.StoredProcedure;
                //command.CommandText = "sp_dinner";
                foreach (var item in dinnerItems)
                {
                    command.CommandType = CommandType.Text;
                    command.Parameters.AddWithValue("@dinner", item);
                    command.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                sqlConn.Close();
            }
        }
    }
    return Dinners;
}

从 sql 数据库中删除数据不起作用

如果dinnerItems是一个字符串列表,那么说,除非你绝对必须,否则不要使用dynamic

若要删除一堆项,请发出一个带有 IN 子句的 sql 查询。不要发出很多单独的查询。

试试这个:

    public int RemoveDinners(List<string> dinnerItems)
    {
        using (var sqlConn = new SqlConnection(_sqlConnectionString))
        {
            const string sqlQuery = "delete from DinnerTemplates where Dinner in ({0})";
            using (var command = new SqlCommand())
            {
                var paramNames = new string[dinnerItems.Count];
                int i = 0;
                foreach (string item in dinnerItems)
                {
                    string paramName = "@Dinner" + i;
                    command.Parameters.AddWithValue(paramName, item);
                    paramNames[i] = paramName;
                    i += 1;
                }
                command.CommandText = String.Format(sqlQuery, String.Join(",", paramNames));
                command.Connection = sqlConn;
                command.CommandType = CommandType.Text;
                sqlConn.Open();
                return command.ExecuteNonQuery();
            }
        }
    }

你必须记住,你遗漏了一些真正相关的代码,比如什么是DinnerItem,因为你在与其类型相关的行上得到错误。

但是,您收到该错误的原因是item无法编送到类似 stringint 之类的类型。

这可能是因为item很可能是一个自定义类。一种选择是重写类的 ToString 方法:

public override string ToString() {
    // return some property value, or set of property values
    // strung together here.
}

另一种选择是在发出AddWithValue时发送您希望关闭item的实际Property

您需要为命令的参数定义 SqlDbType。

不使用动态类型,使用字符串。如果我是你,我宁愿

IsDelete = _dinnerRemover.RemoveDinners(lstDinner.SelectedItems.ToString());

将参数更改为 :

public bool RemoveDinners(string dinnerItems)

以及查询到:

const string sqlQuery = "delete from DinnerTemplates where Dinner = dinnerItems";