2

所以我想从我的列表框中删除一行,这是用户按下删除的地方,程序应该做它的事情。唯一的事情是它没有。如果我只是删除名字,它会正常工作并且我的数据库会更新,但是当我尝试同时使用名字和姓氏时,它就不起作用了。有人可以帮帮我吗。我是新手,这是为学校分配的。非常感谢。

干杯

SqlConnection cn;
        cn = new SqlConnection();
        cn.ConnectionString = "Data source=(local); Initial Catalog=INT422Assignment1;Integrated Security=SSPI;";
        cn.Open();
        SqlCommand cmd;
        cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "DELETE FROM myTable WHERE firstName=@firstName AND lastName=@lastName";


        SqlParameter param;
        param = new SqlParameter("@firstName", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = firstNameDelete.Text;
        cmd.Parameters.Add(param);

        param = new SqlParameter("@lastName", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = lastNameDelete.Text;
        cmd.Parameters.Add(param);


        cmd.ExecuteNonQuery();

        cn.Close();




        MessageBox.Show("Deleted");
        this.Close();
4

4 回答 4

0

哦,对不起,伙计们迟到了回复。所以本质上这是我做错的:在我的主表单中,当我填充我的列表框时,这就是我使用的:

s = reader["firstName"].ToString() + "-" + reader["lastName"].ToString(); studentInfoListBox.Items.Add(s); } 

在 deleteItem 表单中,我执行了以下操作:

string[] b = curItem.Split('-'); firstNameDelete.Text = b[0].ToString(); lastNameDelete.Text = b[1].ToString(); 

所以我在主窗体部分添加了一个额外的空间“ - ”

于 2012-10-27T17:34:27.723 回答
0

尝试使用此查询并检查小写或大写字符

从 myTable 中删除 Upper(FirstName)=Upper(@firstName) AND Upper(LastName)=Upper("@LastName");

或者您可以使用 Like not = 如果您不准确搜索单词

您可以检查受执行影响的行

int numberOfRecords = cmd.ExecuteNonQuery();

于 2012-10-27T01:53:21.207 回答
0

我认为你从一开始就采取了错误的方法。假设您有两个 John,John Smith 和 John Doe。如果您的查询是:

DELETE FROM myTable WHERE FirstName="John";

这意味着所有以“John”为名字的条目都将被删除,包括 Johns。

如果你有:

DELETE FROM myTable WHERE FirstName="John" AND LastName="Doe";

然后理论上 John Doe 将被移除。再说一次,如果你有不止一个 John Doe 怎么办?您要全部删除吗?

如果要删除单个条目,您想要的是根据列表中包含唯一 ID 的隐藏列删除,或者更好的是,将列表框绑定到表。

于 2012-10-27T01:37:16.340 回答
0

该代码本质上没有任何“错误”。但是(主要是对评论的回顾):

  1. 确保输入值符合预期1并验证命令在 SSMS 或类似的交互式 SQL 客户端2中运行(使用预期值) 。

  2. 确保外壳/间距正确。这是否重要取决于特定列的 COLLATION 设置。同样,尝试来自 SSMS 或类似工具的命令将显示这是否有效。

  3. 检查ExecuteNonQuery更改的“记录数”的结果。如果 DELETE 成功,它应该是 1。事务范围可能会出现一些问题,所以这个值很重要。尽管如果仅使用名字就可以“正常工作”,这不太可能,但这是一个很好的检查。


1使用 Visual Studio 调试器检查绑定到参数的值。

2在这些测试期间可以使用事务来避免“真正删除”。或者,DELETE可以更改为,SELECT因为它不会影响实际的查询 ( WHERE .. AND) 逻辑。

于 2012-10-27T02:02:19.113 回答