1

当您从列表框中选择项目时,您想删除选定的项目。为什么从数据库中删除选定的数据时它不起作用?我肯定错过了什么。我收到错误消息 没有来自对象类型的映射。

这是一个方法参数:

  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;
}
4

4 回答 4

2

If dinnerItemsis a list of strings 然后说,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();
            }
        }
    }
于 2013-06-19T12:27:52.810 回答
0

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

但是,您收到该错误的原因是因为item无法编组为类似stringor的类型int

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

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

另一种选择是Propertyitem发出AddWithValue.

于 2013-06-19T12:04:54.607 回答
0

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

于 2013-06-19T12:11:06.193 回答
0

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

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

将参数更改为:

public bool RemoveDinners(string dinnerItems)

和查询:

const string sqlQuery = "delete from DinnerTemplates where Dinner = dinnerItems";
于 2013-06-19T13:22:09.113 回答