从 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;
}
如果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
无法编送到类似 string
或 int
之类的类型。
这可能是因为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";