【问题标题】:Datagridview cell value change update databaseDatagridview单元格值变化更新数据库
【发布时间】:2014-12-28 21:35:37
【问题描述】:

我已将 Mysql 数据库中的数据检索到 DataGridView1 中。假设我在第 0 行。当我更改第 0 行、单元格 1 的内容并按回车键或按钮时,更新查询应该修改该行,但我无法修改单元格的值。当我重新加载数据并且未修改数据库时,单元格将保持其先前的值。例如,如果我将 Client_Name 列下的单元格内容从“Acs”更改为“Gmt”,如何将单元格的值从“Acs”更改为“Gmt”?并将其更新到 Mysql 数据库中,我在 Vs 2012 中使用 c#。下面是我的代码,它将我的数据库检索到 datagridview1 中,欢迎任何帮助谢谢。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.Data.SqlClient;

namespace PI.Gen
{
    public partial class frmMain : Form
    {
        MySqlConnection Conn;


        public frmMain()
        {
            InitializeComponent();
            btnDisconnect.Enabled = true;
            btnLoadData.Enabled = false;
            btnLoadClients.Enabled = false;

        }





        private void btnConnect_Click(object sender, EventArgs e)
        {

            string strConnect = "server=" + txtServer.Text + ";uid=" + txtUsername.Text + ";pwd=" + txtPassword.Text + ";database=" + txtDatabase.Text;
            try
            {
                if (txtServer.TextLength <= 0 || txtUsername.TextLength <= 0 || txtDatabase.TextLength <= 0)
                {
                    MessageBox.Show("You have an empty database connection field. Please supply a valid value.");
                    return;
                }

                Conn = new MySqlConnection(strConnect);
                Conn.Open();

                if (Conn.State.ToString() != "Open")
                {
                    MessageBox.Show("Could not open database connection");
                    return;
                }
                btnDisconnect.Enabled = true;
                btnConnect.Enabled = false;
                btnLoadData.Enabled = true;
                btnLoadClients.Enabled = true;
                //  btnSubmitClient.Enabled = true;
            }
            catch (Exception ex)  // catch on general exceptions, not specific
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }



        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Conn != null)
            {
                Conn.Close();
            }
        }

        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            try
            {
                Conn.Close();
                Conn = null;
                btnDisconnect.Enabled = false;
                btnConnect.Enabled = true;
                btnLoadData.Enabled = false;
                btnLoadClients.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }





        private void btnLoadData_Click(object sender, EventArgs e)
        {
            try
            {
                string CmdString = "SELECT * FROM t_receipients";
                MySqlDataAdapter sda = new MySqlDataAdapter(CmdString, Conn);
                DataSet ds = new DataSet();

                sda.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0].DefaultView;


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }

         }


        private void btnLoadClients_Click(object sender, EventArgs e)
        {
            try
            {

                string CmdString = "SELECT * FROM t_clients";
                MySqlDataAdapter sda = new MySqlDataAdapter(CmdString, Conn);

                DataSet ds = new DataSet();
                sda.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0].DefaultView;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }

        }

【问题讨论】:

  • 首先.. 不要保持与数据库的开放连接。您可以尝试连接,但保持打开状态不会保存
  • 我用断开按钮关闭它
  • 是的,但是如果您的应用程序崩溃了怎么办?然后你保持一个开放的连接。

标签: c# mysql datagridview


【解决方案1】:

经过一系列的试验和错误,我终于找到了我想要的东西,因此能够从下面的 datagridview 更新数据库是我工作的代码,它 100% 有效,希望它在未来对某人有所帮助,感谢@RageComplex 的帮助出来了,但是还有一件事有人知道如何实现我的意思,而不是按 Enter 按钮来更改 datagridview,而是单击按钮 ty

   private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        try
        {
            DataTable changes = ((DataTable)dataGridView1.DataSource).GetChanges();
            if (changes != null)
            {
                MySqlCommandBuilder mcb = new MySqlCommandBuilder(mySqlDataAdapter);
                mySqlDataAdapter.UpdateCommand = mcb.GetUpdateCommand();
                mySqlDataAdapter.Update(changes);
                ((DataTable)dataGridView1.DataSource).AcceptChanges();

                MessageBox.Show("Cell Updated");
                return;
            }


        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }


    }

【讨论】:

  • 应用程序在这方面运行是不是有点慢?验证行时有点滞后?
【解决方案2】:

您没有更新对数据库的更改。保持连接打开并不意味着这会自动更新您的数据。

首先,不要让您的连接保持打开状态。在您的应用中,您有一个 connect 按钮,该按钮适用于测试,但不适用于真正保持连接打开,我认为不适用于数据库。

你加载数据的方式是正确的。

您为 datagridview 提供一个 DataSource,它是您的 DataSet 中的一个表。因此,在 datagridview 中所做的更改将保存到您的 DataSet 而不是您的数据库中。

这就是您更新数据库的方式

   public void UpdateTable(DataSet ds)
    {
        using (MySqlConnection connect = new MySqlConnection(ConnString))
        {
            connect.Open();
            MySqlDataAdapter adapt = new MySqlDataAdapter();
            MySqlCommandBuilder commbuilder = new MySqlCommandBuilder(adapt);
            adapt.SelectCommand = new MySqlCommand("SELECT * FROM t_receipients", connect);
            adapt.Update(ds.Tables[0]); 
        }
    }

确保在更新数据库之前使用datagridview1.EndEdit()

另外,using,这将确保在完成该代码后再次关闭连接,最好始终将其放在 try-except 中。

您在连接数据库方面遇到了困难,因为它似乎在表扬中。 我也忘了在上面包含 MySqlDataAdapter,在这种情况下我全局使用了一个适配器。 我不想将这个问题报告为重复,但现在看起来确实有点像 this answer.

【讨论】:

  • 我按照你的建议给了它连接字符串,并在上面插入了你的代码,但我无法更新数据库可能是我的结构不够好,所以请看看我做了什么
  • 使用 (MySqlConnection connect = new MySqlConnection("datasource=localhost;database=sms_pigen;username=root;password=splintercell1")) { connect.Open();字符串 CmdString = "SELECT * FROM t_receipients"; MySqlDataAdapter sda = new MySqlDataAdapter(CmdString, connect);数据集 ds = new DataSet(); sda.填充(ds); dataGridView1.DataSource = ds.Tables[0].DefaultView;
  • public void UpdateTable(DataSet ds){ using (MySqlConnection connect = new MySqlConnection("datasource=localhost;database=sms_pigen;username=root;password=splintercell1"))connect.Open(); MySqlCommandBuilder commbuilder = new MySqlCommandBuilder(adapt);adapt.SelectCommand = new MySqlCommand("SELECT * FROM t_receipients, connect");adapt.Update(ds.Tables[0]);和一个“try-catch 异常”
  • 我建议首先删除这些连接字符串的密码...首先。数据是否正确显示在 datagridview 中?是的:那么您知道连接正常并且 selectCommand 是正确的。如果没有,请检查。 new MySqlDataAdapter 的一部分丢失了,看起来没问题,你得到了什么错误,很重要,检查更新的答案
  • 与数据库相比,我能够获得正确的数据,这意味着我的连接字符串没问题我添加了新的 MySqladapter 和 dataGridView1.EndEdit();在 try-catch 中,但仍然不允许我...请您用您的代码编辑我的初始代码,看看我哪里出错了 ty
【解决方案3】:

我想提供在我的应用程序中测试过的代码。我将它用于按钮点击事件。

private void button3_Click(object sender, EventArgs e)
    {
        string StrQuery;
        try
        {
            string MyConnection2 = "server=localhost;user id=root;password=;database=k";
            using (MySqlConnection conn = new MySqlConnection(MyConnection2))
            {
                using (MySqlCommand comm = new MySqlCommand())
                {
                    comm.Connection = conn;
                    conn.Open();
                    for (int i = 0; i < dataGridView3.Rows.Count; i++)
                    {
                        StrQuery = @"update s set  Quantity='" + dataGridView3.Rows[i].Cells["Quantity"].Value.ToString() + "' where No='" + dataGridView3.Rows[i].Cells["Item No"].Value.ToString() + "';";

                        comm.CommandText = StrQuery;
                        comm.ExecuteNonQuery();
                    }
                }
            }
        }
        catch
        { 
        }
    }

我觉得对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2019-07-17
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多