【问题标题】:delete listbox data in winform C#在winform C#中删除列表框数据
【发布时间】:2013-08-09 18:07:38
【问题描述】:

我想在 C# WinForm 应用程序中使用列表框从数据库中删除数据。我正在尝试这段代码,但它不起作用。请告诉我如何从 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();

【问题讨论】:

  • 什么不工作?
  • 数据未从列表框中删除
  • PIDint 吗?如果是这样,您可能希望删除命令文本中参数周围的单引号 '
  • 您忘记添加一行来执行此操作,例如:listBox1.Items.Clear();
  • 在某处声明这是一个数据绑定的 ListBox 可能会避免一些混乱。

标签: c# sql-server winforms listbox


【解决方案1】:

如果PIDint 数据类型,您将收到数据转换错误,因为您将ID 值作为varchar 而不是int 传递。

从命令文本中删除单引号将修复它:

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

根据用户进一步的 cmets 进行编辑

ListBox 实际上是数据绑定时,您会收到错误,因为 SelectedItem 属性会返回 DataRowView 而不是值。

在调用SqlCommand 之前,您需要从DataRowView 对象中获取PID 列的值。

【讨论】:

  • 感谢我从 DataRowView 对象中获取值的解决方案,它现在运行良好
【解决方案2】:

是手动生成的还是数据绑定的;

如果手动生成使用

listBox1.Items.Remove(i);

如果是数据绑定,您需要在这种情况下刷新绑定。

问候一月

【讨论】:

  • 补充:我想我误解了这个问题;它不会从数据库中删除还是不会删除 ui 元素?
  • 这就是重点 - 它显然是数据绑定的,他想要一个考虑到这一点的答案......
  • 将 varchar 值“System.Data.DataRowView”转换为数据类型 int 时出现错误转换失败。
  • @Killercam 我想使用这个列表框从数据库中删除数据
  • 从消息中可以清楚地看出,您需要从 SQL 表达式中删除单引号。 new SqlCommand(String.Format("DELETE FROM Tb_IdProof WHERE PID={0}", i), con);。这将解决您的问题...
【解决方案3】:

您可以改进以下几点:

  • 使用参数化命令
  • 不要混合代码和数据
  • 了解 SQL 注入攻击
  • 添加错误处理代码
  • 将 db 代码与 UI 清理代码分离为两种方法

这可能会解决您的问题。

编辑

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

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

如果你默认应用了防御性编码,你可以避免很多麻烦。

始终假设环境是敌对的,用户输入是邪恶的并且不信任任何人。请随意不同意,您已被警告。

【讨论】:

  • 这如何回答他的问题? “阅读 SQL 注入攻击”,为什么,他的应用程序可能不基于网络,不支持网络 - 软件用户是否会开始攻击自己的数据库?我非常讨厌这种笼统的评论......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2021-11-06
  • 2019-06-07
相关资源
最近更新 更多