我正在尝试创建一个简单的Windows窗体应用程序,该应用程序可以与数据库交互以管理某些数据。我在尝试创建删除按钮时遇到了问题,我已多次创建类似的应用程序,但无法找出此处的问题。
此任务的目的是创建一个“删除”按钮,用于从数据库中删除选定的行。由于我只能使用ADO.NET(不带DataBinding)和DataGridView,因此我执行了以下操作:
private void buttonViewPersonDelete_Click(object sender, EventArgs e)
{
string sSqlConnection = GetDBConnectionString("dbConnectionString");
DialogResult result = MessageBox.Show("Are you sure you want to delete selected data?", "Delete", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (result.Equals(DialogResult.OK))
{
using (SqlConnection sqlConn = new SqlConnection(sSqlConnection))
{
sqlConn.Open();
SqlTransaction sqlTrans;
sqlTrans = sqlConn.BeginTransaction();
try
{
using (SqlCommand sqlCmd = new SqlCommand("", sqlConn, sqlTrans))
{
DataGridViewRow selectedRow = dataGridViewPerson.CurrentCell.OwningRow;
string sPersonID = selectedRow.Cells[0].Value.ToString();
//int iRowIndex = dataGridViewPerson.CurrentCell.RowIndex;
//string sPersonID = dataGridViewPerson.Rows[iRowIndex].Cells[0].Value.ToString();
string sQuery = "DELETE FROM dbo.Person WHERE iPersonID = @PersonID";
sqlCmd.Parameters.Add("@PersonID", SqlDbType.Int).Value = sPersonID;
sqlCmd.CommandText = sQuery;
sqlTrans.Commit();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
try
{
sqlTrans.Rollback();
}
catch (Exception ex2)
{
MessageBox.Show(ex2.Message, ex2.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
finally
{
UpdateDataGridViewStatus();
sqlConn.Close();
}
}
}
else
{
return;
}
}
我已经检查了查询在SSMS中是否有效,我还确保了sPersonID确实从所选行接收到了正确的ID,问题似乎与执行查询本身有关,我尝试了在没有SqlTransaction的情况下执行查询,并以几种不同的方式重新构造代码(为什么它看起来如此混乱),重新构建解决方案,等等。
预期的结果是,该事件将从DataGridView中获取ID,将其作为参数传递给SQL查询,然后SQL查询将执行并从数据库中删除所需的行。
2条答案
按热度按时间fcg9iug31#
您从未执行DELETE语句。您打开了一个事务,准备了一个命令,然后立即提交了该事务。请在提交之前添加以下内容:
nbysray52#
事实证明,这是一件如此简单的事情,以至于我把解决问题的道路弄得过于复杂。
执行非查询();- 在代码中缺失。一旦添加,它就能完美地工作。