winforms C# - Windows窗体-删除按钮-无法正确执行SQL命令

4urapxun  于 2023-02-24  发布在  C#
关注(0)|答案(2)|浏览(182)

我正在尝试创建一个简单的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查询将执行并从数据库中删除所需的行。

fcg9iug3

fcg9iug31#

您从未执行DELETE语句。您打开了一个事务,准备了一个命令,然后立即提交了该事务。请在提交之前添加以下内容:

sqlCmd.ExecuteNonQuery();
nbysray5

nbysray52#

事实证明,这是一件如此简单的事情,以至于我把解决问题的道路弄得过于复杂。
执行非查询();- 在代码中缺失。一旦添加,它就能完美地工作。

相关问题