【问题标题】:Update and Delete from DataGridView not functioning从 DataGridView 更新和删除不起作用
【发布时间】:2015-09-30 02:04:19
【问题描述】:

我有一个DataGridView,它显示 3 行,当我尝试更新我的记录时,它说成功更改了记录。但是当我检查数据库时,记录没有更新。

在删除按钮中,它说我必须选择要删除的记录,但我已经在 DataGridView 中选择了一行

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Sql;
using System.Data.SqlClient;

namespace RFG_Inventory_and_Management_System
{
    public partial class AdminForm : Form
    {
        SqlCommand cmd;
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Acer\Documents\Visual Studio 2010\Projects\RFG Inventory and Management System\RFG Inventory and Management System\Database1.mdf;Integrated Security=True;User Instance=True");

        SqlCommandBuilder cmdbl;
        SqlDataAdapter adap;

        DataSet ds;
        int ID = 0;

        public AdminForm()
        {
            InitializeComponent();
            PayratesDisplay();
            NonMemberDisplay();
        }

        //Display Data in DataGridView  
        private void PayratesDisplay()
        {
            con.Open();
            DataTable dt = new DataTable();
            adap = new SqlDataAdapter("select * from tbl_payrates", con);
            adap.Fill(dt);
            dataGridView4.DataSource = dt;
            con.Close();
        }
        private void NonMemberDisplay()
        {
            con.Open();
            DataTable dt = new DataTable();
            adap = new SqlDataAdapter("SELECT tbl_nonMember.*, tbl_customer.lname, tbl_customer.fname, tbl_customer.mname, tbl_customer.gender, tbl_customer.age, tbl_customer.membership_type FROM    tbl_nonMember INNER JOIN tbl_customer ON tbl_nonMember.customerID = tbl_customer.customerID", con);
            adap.Fill(dt);
            dataGridView2.DataSource = dt;
            con.Close();
        }

        //Clear Data  
        private void ClearData()
        {
            tbMemship.Text = "";
            tbPerses.Text = "";
            tbDisc.Text = "";
            ID = 0;
        }  

        private void AdminForm_Load(object sender, EventArgs e)
        {

            // TODO: This line of code loads data into the 'database1DataSet.tbl_customer' table. You can move, or remove it, as needed.
            this.tbl_customerTableAdapter.Fill(this.database1DataSet.tbl_customer);
            // TODO: This line of code loads data into the 'database1DataSet.tbl_nonMember' table. You can move, or remove it, as needed.
            this.tbl_nonMemberTableAdapter.Fill(this.database1DataSet.tbl_nonMember);

        }

        private void fillByToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                this.tbl_customerTableAdapter.FillBy(this.database1DataSet.tbl_customer);
            }
            catch (System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
        }
        //----------------------------------BUTTONS FOR PAY RATE-------------------------------------------------------------//

        //dataGridView1 RowHeaderMouseClick Event  
        private void dataGridView4_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            tbMemship.Text = dataGridView4.Rows[e.RowIndex].Cells[0].Value.ToString();
            tbPerses.Text = dataGridView4.Rows[e.RowIndex].Cells[1].Value.ToString();
            tbDisc.Text = dataGridView4.Rows[e.RowIndex].Cells[2].Value.ToString();
        }  

        private void btn_update_Click(object sender, EventArgs e)
        {
            if (tbMemship.Text != "" && tbPerses.Text != "" && tbDisc.Text != "")
            {
                cmd = new SqlCommand("update tbl_payrates set Membership=@Membership,PerSession=@PerSession where Discounted=@Discounted", con);
                con.Open();
                cmd.Parameters.AddWithValue("@Membership", tbMemship.Text);
                cmd.Parameters.AddWithValue("@PerSession", tbPerses.Text);
                cmd.Parameters.AddWithValue("@Discounted", tbDisc.Text);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Record Updated Successfully");
                con.Close();
                PayratesDisplay();
                ClearData();
            }
            else
            {
                MessageBox.Show("Please Select Record to Update");
            } 
        }

        private void btn_PRadd_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("Are you sure to save Changes", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            if (dr == DialogResult.Yes)
            {
                con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Acer\Documents\Visual Studio 2010\Projects\RFG Inventory and Management System\RFG Inventory and Management System\Database1.mdf;Integrated Security=True;User Instance=True");
                con.Open();
                cmd = new SqlCommand("INSERT INTO tbl_payrates (Membership, PerSession, Discounted) VALUES (@Membership, @PerSession, @Discounted)", con);
                cmd.Parameters.AddWithValue("@Membership", tbMemship.Text);
                cmd.Parameters.AddWithValue("@PerSession", tbPerses.Text);
                cmd.Parameters.AddWithValue("@Discounted", tbDisc.Text);
                cmd.ExecuteNonQuery();
            }   
        }

        private void btn_PRdel_Click_1(object sender, EventArgs e)
        {
            //Update button update dataset after insertion,upadtion or deletion
            DialogResult dr = MessageBox.Show("Are you sure to save Changes", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

            if (dr == DialogResult.Yes)
            {
                if (ID != 0)
                {
                    cmd = new SqlCommand("DELETE FROM tbl_payrates WHERE ID=@id", con);
                    con.Open();
                    cmd.Parameters.AddWithValue("@id", ID);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    MessageBox.Show("Record Deleted Successfully!");
                    PayratesDisplay();
                    ClearData();
                }

                else
                {
                    MessageBox.Show("Please Select Record to Delete");
                }
            }
        }
    }
}

【问题讨论】:

  • 尝试在所有函数中在cmd = new SqlCommand("之前切换con.Open();。看看它是否有帮助。我看到变量ID 在任何地方都没有改变,因此它说select a record to delete
  • 我尝试切换con.Open();cmd = new SqlCommand 仍然数据库没有更新。是的,上面写着select a record to delete
  • 当用户选择他们想要删除的项目时,您是否有选择的索引更改方法?我建议将该值存储在隐藏字段中,并将其设置为您要删除的值。

标签: c# sql visual-studio datagridview


【解决方案1】:

整个 AttachDbFileName= 方法存在缺陷 - 充其量!在 Visual Studio 中运行您的应用程序时,它将复制 .mdf 文件(从您的 App_Data 目录到输出目录 - 通常是 .\bin\debug - 您的应用程序运行的位置)并且很可能 ,您的 INSERT 工作正常 - 但您最终只是查看了错误的 .mdf 文件

如果您想坚持使用这种方法,请尝试在 myConnection.Close() 调用上设置断点 - 然后使用 SQL Server Mgmt Studio Express 检查 .mdf 文件 - 我几乎可以肯定您的数据在那里。

在我看来,真正的解决方案

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. SSMS Express中创建你的数据库,给它一个逻辑名称(例如InventoryDb

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=InventoryDb;Integrated Security=True
    

    其他一切都一模一样和以前一样......

有关更多背景信息,另请参阅 Aaron Bertrand 的优秀博文 Bad habits to kick: using AttachDbFileName

【讨论】:

    【解决方案2】:

    我认为您没有为 id 分配值。所以 id 始终为 0,您无法删除记录。尝试将值分配给 ID 并删除。我希望它可以正常工作。

    private void btn_PRdel_Click_1(object sender, EventArgs e)
        {
            //Update button update dataset after insertion,upadtion or deletion
            DialogResult dr = MessageBox.Show("Are you sure to save Changes", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
    
            if (dr == DialogResult.Yes)
            {
                if (ID != 0)// where is the id value?
                {
                    cmd = new SqlCommand("DELETE FROM tbl_payrates WHERE ID=@id", con);
                    con.Open();
                    cmd.Parameters.AddWithValue("@id", ID);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    MessageBox.Show("Record Deleted Successfully!");
                    PayratesDisplay();
                    ClearData();
                }
    
                else
                {
                    MessageBox.Show("Please Select Record to Delete");
                }
            }
        }
    

    【讨论】:

    • 但是每次我尝试删除一条记录时,当我单击按钮时,即使我已经在 DataGridView 中选择了一条记录,消息 Please Select Record to Delete 也会一直显示
    • 请显示代码,您在删除方法中将所选值分配给 ID 变量。
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2020-02-02
    相关资源
    最近更新 更多