当您从列表框中选择项目时,您想要删除选定项目。当从数据库中删除选定的数据时,为什么它不起作用?我一定错过了什么。我收到了错误消息 对象类型不存在映射。
这是一个方法参数:
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;
}
答案 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
无法封送到某种类似string
或int
的内容。
这可能是因为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";