【问题标题】:updating a database through dataGridView通过 dataGridView 更新数据库
【发布时间】:2026-01-29 07:15:01
【问题描述】:

我在 c# 中有一个 datagridview,我用我想要的数据库中的任何表填充它,从文本框中获取表名。一切都很好,直到我尝试将我在 datagridview 中所做的更改提交到数据库。

button2 是我将用于更新的按钮。我已经搜索过了,显然更新适配器应该可以工作,但在这种情况下它不起作用,我不知道为什么。这是我的代码:

public partial class Form1 : Form
{
    static string connstr = "DataSource=localhost;Database=sc2db;Trusted_Connection=True;";
    SqlConnection conn = new SqlConnection(connstr);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            SqlDataAdapter adap = new SqlDataAdapter();
            DataTable dt = new DataTable();
            //BindingSource bs = new BindingSource();
            SqlCommand comm = new SqlCommand("select * from " + textBox1.Text, conn);
            adap.SelectCommand = comm;
            dataGridView1.DataSource = dt;
            adap.Fill(dt);
        }

        catch (Exception ex)
        {
            label1.Text = ex.Message;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            SqlDataAdapter adap = new SqlDataAdapter();
            DataTable dt = new DataTable();
            BindingSource bs = new BindingSource();
            adap.Update(dt);
        }

        catch (Exception ex)
        {
            label1.Text = ex.Message;
        }
    }
}

【问题讨论】:

标签: c# sql-server winforms datagridview


【解决方案1】:

button2_Click 事件处理程序中的adap 没有初始化任何命令(SelectCommand、DeleteCommand、InsertCommand 和 UpdateCommand)。那么如何更新呢?

您显然不了解 DataAdapter 的工作原理。 DataAdapter 有 4 个命令,分别是 SelectCommand、DeleteCommand、InsertCommand、UpdateCommand。 SelectCommandFill() 方法工作所必需的。 Update() 方法需要其他命令才能工作,当然在一般情况下,DataRows 可以具有各种状态:DataRowState.Deleted、DataRowState.Added、DataRowState.Modified。 SelectCommand 也需要使用CommandBuilder(在SqlClient 中为SqlCommandBuilder)自动构建其他命令。在Update() 方法中传递一个DataTable 后,将浏览该表中的所有行,并检查每个DataRow 的状态以查看该行是否被添加、删除或修改,并且适配器将调用相应的命令(InsertCommand、DeleteCommand 和 UpdateCommand)它必须对数据库执行实际操作。

在您的情况下,您可以尝试将您的 adap 声明为公共,并在调用方法 Update() 之前使用 SqlCommandBuilder 为其构建其他命令,如下所示:

SqlCommandBuilder cb = new SqlCommandBuilder(adap);

请记住,使用SqlCommandBuilder() 仅适用于 Select 查询中的单个表,如果涉及的表超过 1 个,则必须为 DataAdapter 构建自己的命令。这并不难,您可能需要搜索更多关于如何为 DataAdapter 构建命令的信息。

希望对您有所帮助!

【讨论】:

    【解决方案2】:
    private void button3_Click(object sender, EventArgs e)
            {
                scb = new SqlCommandBuilder(sqlDataAdapter1);
                sqlDataAdapter1.Update(dataSetUser);
            }
    

    我可以通过此代码从 gridview 编辑我的数据库

    【讨论】: