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

时间:2013-06-19 11:57:52

标签: c# .net sql

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

这是一个方法参数:

  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 个答案:

答案 0 :(得分:2)

如果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();
            }
        }
    }

答案 1 :(得分:0)

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

但是,您收到该错误的原因是item无法封送到某种类似stringint的内容。

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

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

另一种选择是在发出Property时发送您想要item的实际AddWithValue

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

将参数更改为:

public bool RemoveDinners(string dinnerItems)

和查询:

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