【问题标题】:How to update SQL Server database using Datagridview binding source C#如何使用 Datagridview 绑定源 C# 更新 SQL Server 数据库
【发布时间】:2015-01-12 19:30:33
【问题描述】:

我正在用 C# 编写一个 Winforms 应用程序,它允许用户使用 datagridview 编辑和更新数据库。

问题是,我无法让它工作。我设法实现的唯一一件事是更新 datagridview 显示的内容,但是当我进入数据库表时,数据没有任何变化。 我已经搜索了很多讨论这个问题的网站,但还没有对我有用。

到目前为止我尝试过的事情:

  • 将数据库绑定到 datagridview
  • Copy to Output Directory 属性更改为Copy if newer
  • 使用dataAdapter.Update((DataTable)bindingSource1.DataSource) 执行或不执行任何更新查询。
  • 在没有dataAdapter.update(...)的情况下执行更新查询。

这是我的代码:

public Form1()
{
    InitializeComponent();
    GetData("SELECT * FROM Table1");
}

void GetData(string selectCommand)
{
    SqlConnection conn = new SqlConnection(Properties.Settings.Default.NewDBTESTConnectionString);

    dataAdapter = new SqlDataAdapter(selectCommand, conn);
    commandBuilder = new SqlCommandBuilder(dataAdapter);

    table = new DataTable();
    dataAdapter.Fill(table);

    bindingSource1.DataSource = table;
    dataGridView1.DataSource = bindingSource1;
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
        dataAdapter.Update((DataTable)bindingSource1.DataSource);    
}

【问题讨论】:

  • 您需要向数据适配器添加插入和更新命令
  • 感谢您的快速回复。您将如何以及在何处使用这些命令,因为它不适合我。

标签: c# sql sql-server database datagridview


【解决方案1】:

如果不调用bindingSource1.EndEdit,您的底层 DataTable 不会看到任何变化,因此 Update 命令没有任何可更新的内容。

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    bindingSource1.EndEdit();
    DataTable dt = (DataTable)bindingSource1.DataSource;

    // Just for test.... Try this with or without the EndEdit....
    DataTable changedTable = dt.GetChanges();
    Console.WriteLine(changedTable.Rows.Count);

    int rowsUpdated = da.Update(dt);    
    Console.WriteLine(rowsUpdated);
}

【讨论】:

  • 感谢您的回复。我刚刚尝试了您的建议,它确实保存了更改,但是当我查看数据库时,它没有显示更新。只有当我运行程序时,我才会在 datagridview 中看到我的更改,而不是在数据库中。
  • 你在看什么数据库?如果您使用服务器资源管理器窗口,请检查您是否具有相同的连接字符串。有时 ServerExplorer 连接到项目文件夹中的 MDF 文件,而程序在 BIN\DEBUG 文件夹中的那个文件上工作。
  • 是的,你是对的!我正在使用服务器资源管理器窗口。现在我已经将它更改为它在其属性中提供的连接字符串,而不是我所做的(Properties.Settings.Default.NewDBTESTConnectionString),我也看到了数据库的更新!非常感谢!
【解决方案2】:

你可以有一个保存或更新按钮来执行这样的代码:

bindingSource1.EndEdit();
DataTable dt = (DataTable)bindingSource1.DataSource;   
dataAdaper.Update(dt);    

您将保存所做的所有更改,但如果您先对 datagridview 列进行排序,然后更改数据,然后运行上面的保存代码,您将丢失一条记录,即排序前的第一个记录。要修复它,您必须对其进行排序然后保存它们。如果您知道要对哪一列进行排序,最好的方法是在将数据加载到 datagridview 时对其进行排序。

贾庄

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多