0

我想在 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();
4

3 回答 3

3

如果PIDint数据类型,您将收到数据转换错误,因为您将 ID 值作为varcharint.

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

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

编辑以下用户的进一步评论

由于它ListBox实际上是数据绑定的,因此您正在收到错误,因为该SelectedItem属性正在给您返回 aDataRowView而不是一个值。

PID调用. _DataRowViewSqlCommand

于 2013-08-09T09:49:51.733 回答
0

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

如果手动生成使用

listBox1.Items.Remove(i);

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

问候简。

于 2013-08-09T09:49:56.347 回答
0

您可以改进以下几点:

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

这可能会解决您的问题。

编辑

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

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

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

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

于 2013-08-09T09:51:21.153 回答