所以我想从列表框中删除一行,这是用户按下删除的地方,程序应该这样做。唯一的问题是它没有。如果我只是删除第一个名称,它将正常工作,我的数据库更新,但当我尝试同时使用名字和姓氏时,它不起作用。有人可以帮帮我吗。我是新手,这是为了学校的任务。非常感谢你。
干杯
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();
答案 0 :(得分:0)
我认为你从一开始就采用了错误的方法。假设你有两个约翰斯,约翰史密斯和约翰多伊。如果您的查询是:
DELETE FROM myTable WHERE FirstName="John";
这意味着所有以“John”作为名字的条目将被删除,两者都是Johns。
如果你有:
DELETE FROM myTable WHERE FirstName="John" AND LastName="Doe";
然后在理论上John Doe将被删除。再说一次,如果你有一个以上的John Doe怎么办?你想把它们全部删掉吗?
如果您想删除单个条目,您想要的是根据列表中包含唯一ID的隐藏列进行删除,或者更好的方法是将列表框绑定到您的表格。
答案 1 :(得分:0)
尝试使用此查询并检查较低或较高的Case Char
DELETE FROM myTable WHERE Upper(FirstName)= Upper(@ firstName)AND Upper(LastName)= Upper(" @ LastName");
或者你可以使用Like not =如果你不搜索确切的单词
您可以检查执行中受影响的行
int numberOfRecords = cmd.ExecuteNonQuery();
答案 2 :(得分:0)
该代码没有任何固有的“错误”。然而(并且主要是对评论的回顾):
确保输入值符合预期 1 并验证命令是否在SSMS或类似的交互式SQL客户端 2 中运行(具有预期值)。 / p>
确保套管/间距正确。如果这很重要取决于特定列的COLLATION设置。再次,尝试SSMS或类似工具的命令将显示这是否有效。
检查ExecuteNonQuery
的结果是否有“更改的记录数”。如果DELETE成功,则应为1。事务范围可能会出现问题,因此这个值非常重要。虽然如果仅使用名字“工作正常”这是不太可能的,但这是一个很好的检查。
1 使用Visual Studio调试器检查绑定到参数时的值。
2 交易可用于避免在这些测试中“真正删除”。或者,DELETE
可以更改为SELECT
,因为它对实际查询(WHERE .. AND
)逻辑没有影响。
答案 3 :(得分: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();
所以我在主要表单部分“ - ”
中添加了一个额外的空格