我正在尝试从数据库和DataGridView中删除选定的行。
下面的代码似乎有效,因为如果我启动程序并删除它从数据网格中删除的行。如果我重新加载程序,它仍然从数据网格中删除。但是,如果我使用数据库资源管理器查看该表,那么行仍然存在。如果我刷新表并重新加载程序,则会显示已删除的行。
知道为什么会这样吗?
private void button1_Click(object sender, EventArgs e)
{
Int32 selectedRowCount = dataAccounts.Rows.GetRowCount(DataGridViewElementStates.Selected);
if (selectedRowCount > 0)
{
using (SqlCeConnection c = new SqlCeConnection(Properties.Settings.Default.snogAccountsConnectionString))
{
c.Open();
for (int i = 0; i < selectedRowCount; i++)
{
using (SqlCeCommand com = new SqlCeCommand("DELETE FROM accounts WHERE id = (@id)", c))
{
com.Parameters.AddWithValue("@id", dataAccounts.SelectedRows[i].Cells["userID"].Value);
com.ExecuteNonQuery();
}
dataAccounts.Rows.RemoveAt(i);
}
}
}
else
{
MessageBox.Show("Select some rows to delete.");
}
}
答案 0 :(得分:1)
您是否在主键字段中使用BIGINT。我有一个表使用BIGINT作为主键,并且会发生各种奇怪的事情。
您不能只使用SQL Management Studio GUI编辑表工具进行更新。它总是抱怨,你经常不得不使用CAST语句来告诉系统它是什么类型的数据,尽管你这样做时告诉你这可能是不必要的。 BIGINT导致许多记录在案的问题。
我可以更新此表中记录的唯一方法是使用更新T-SQL语句。
您也可以尝试格式化代码:
using (SqlCeCommand com = new SqlCeCommand("DELETE FROM accounts WHERE id ="+ dataAccounts.SelectedRows[i].Cells["userID"].Value.ToString(), c))
{
com.ExecuteNonQuery();
}
当然,如果传递了错误的数据类型,这将引发错误,但至少你应该知道。