C# 在winform C中删除列表框数据#

C# 在winform C中删除列表框数据#,c#,sql-server,winforms,listbox,C#,Sql Server,Winforms,Listbox,我想在C#WinForm应用程序中使用aa ListBox从数据库中删除数据。我正在尝试此代码,但它不起作用。请告诉我如何从列表框中删除数据 它给了我这个错误 将varchar值“System.Data.DataRowView”转换为数据类型int时,转换失败 string i= listBox1.SelectedItem.ToString(); SqlConnection con = new SqlConnection(); con.ConnectionString = Configur

我想在C#WinForm应用程序中使用aa ListBox从数据库中删除数据。我正在尝试此代码,但它不起作用。请告诉我如何从列表框中删除数据

它给了我这个错误

将varchar值“System.Data.DataRowView”转换为数据类型int时,转换失败

string i= listBox1.SelectedItem.ToString(); 

SqlConnection con = new SqlConnection();

con.ConnectionString = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

con.Open();

SqlCommand CmdAddProof = new SqlCommand("delete from Tb_IdProof where PID='" + i+ "'", con);

CmdAddProof.CommandType = CommandType.Text;

CmdAddProof.ExecuteNonQuery();

textBox1.Text = string.Empty;

ShowProof();

con.Close();

如果
PID
int
数据类型,则会出现数据转换错误,因为您将ID值作为
varchar
而不是
int
传递

从命令文本中删除单引号将修复此问题:

SqlCommand CmdAddProof = new SqlCommand("delete from Tb_IdProof where PID=" + i, con);
编辑以下用户的进一步评论

当发现
ListBox
实际上是数据绑定时,您收到了错误,因为
SelectedItem
属性返回的是
DataRowView


在调用
SqlCommand

之前,需要从
DataRowView
对象中获取
PID
列的值。如果
PID
int
数据类型,则会出现数据转换错误,因为您将ID值作为
varchar
而不是
int
传递

从命令文本中删除单引号将修复此问题:

SqlCommand CmdAddProof = new SqlCommand("delete from Tb_IdProof where PID=" + i, con);
编辑以下用户的进一步评论

当发现
ListBox
实际上是数据绑定时,您收到了错误,因为
SelectedItem
属性返回的是
DataRowView


在调用
SqlCommand
之前,需要从
DataRowView
对象中获取
PID
列的值,它是手动生成的还是数据绑定的

如果手动生成,请使用

listBox1.Items.Remove(i);
如果是数据绑定,那么需要刷新绑定


关于1月

是手动生成还是数据绑定

如果手动生成,请使用

listBox1.Items.Remove(i);
如果是数据绑定,那么需要刷新绑定


尊敬一月

有几件事你可以改进:

  • 使用参数化命令
  • 不要混淆代码和数据
  • 了解SQL注入攻击
  • 添加错误处理代码
  • 将db代码与UI清理代码分离为两种方法
这可能会解决您的问题

编辑

如果使用parametrised命令,则向其传递一个类型,以便驱动程序知道如何处理和转义该类型。将变量嵌入查询时,将调用
.ToString()
方法。由于错误地假设字符串表示形式与您期望的一致,可能会出现许多错误。在这种情况下,这将起作用。但是在其他情况下,它可能不起作用。这样的bug真的很难调试,因为它们只在某些情况下出现

您可以选择说应用程序只与本地服务器通信。它永远不会暴露在网络中。然后你换了工作,申请突然变得非常成功,并接触到了互联网。你猜怎么着

如果你在默认情况下应用了防御性编码,你就可以避免很多麻烦


总是假设环境是敌对的,用户输入是邪恶的,不信任任何人。有人警告过你,你可以随意提出不同意见。

有几件事你可以改进:

  • 使用参数化命令
  • 不要混淆代码和数据
  • 了解SQL注入攻击
  • 添加错误处理代码
  • 将db代码与UI清理代码分离为两种方法
这可能会解决您的问题

编辑

如果使用parametrised命令,则向其传递一个类型,以便驱动程序知道如何处理和转义该类型。将变量嵌入查询时,将调用
.ToString()
方法。由于错误地假设字符串表示形式与您期望的一致,可能会出现许多错误。在这种情况下,这将起作用。但是在其他情况下,它可能不起作用。这样的bug真的很难调试,因为它们只在某些情况下出现

您可以选择说应用程序只与本地服务器通信。它永远不会暴露在网络中。然后你换了工作,申请突然变得非常成功,并接触到了互联网。你猜怎么着

如果你在默认情况下应用了防御性编码,你就可以避免很多麻烦



总是假设环境是敌对的,用户输入是邪恶的,不信任任何人。请随意不同意,您已经收到警告。

什么不起作用?数据没有从listboxIs
PID
an
int
中删除?如果是这样,您可能希望删除命令文本中参数周围的单引号
。您忘记添加一行来执行此操作,例如:
listBox1.Items.Clear()在某处声明这是一个数据绑定的列表框可能会避免一些混淆。什么不起作用?数据没有从列表框中删除是
PID
an
int
?如果是这样,您可能希望删除命令文本中参数周围的单引号
。您忘记添加一行来执行此操作,例如:
listBox1.Items.Clear()在某个地方声明这是一个数据绑定的列表框可能会避免一些混淆;它不是从数据库中删除还是删除了ui元素?这就是重点-它显然是数据绑定的,他希望得到一个考虑到这一点的答案…它给我错误转换失败,当将varchar值“System.data.DataRowView”转换为数据类型int时。@Killercam我想用这个从数据库中删除数据ListBox从消息中可以清楚地看到,您需要从SQL表达式中删除单引号<代码>新建SqlCommand