C# 是否将更改的DataGrid更新到数据库?

C# 是否将更改的DataGrid更新到数据库?,c#,sql,wpf,datagrid,C#,Sql,Wpf,Datagrid,好了,伙计们 经过多次阅读并在这里找到解决方案后,我只需要问这个问题。 我已经找过了,但它并没有帮我解决这个问题。 另外,请原谅我的语法错误,如果有的话 有什么问题吗? 我加载了一个WPF表单,表单中有一个组合框。这个组合框从数据库中的所有表中获取所有名称。我选择一个表名并按下一个按钮,用所选的表填充DataGrid WPF。这一切都很完美。但是,当我更改单元格或添加/删除行或列时,我必须将其更新到数据库中。 这就是我被困的地方。我用了一种不太理想的方式。这就是为什么我问是否有更好的解决方案 /

好了,伙计们

经过多次阅读并在这里找到解决方案后,我只需要问这个问题。 我已经找过了,但它并没有帮我解决这个问题。 另外,请原谅我的语法错误,如果有的话

有什么问题吗? 我加载了一个WPF表单,表单中有一个组合框。这个组合框从数据库中的所有表中获取所有名称。我选择一个表名并按下一个按钮,用所选的表填充DataGrid WPF。这一切都很完美。但是,当我更改单元格或添加/删除行或列时,我必须将其更新到数据库中。 这就是我被困的地方。我用了一种不太理想的方式。这就是为什么我问是否有更好的解决方案

//fill the datagrid with data from chosen table in combobox!            
selectedTable = cboxTables.SelectedItem.ToString();
dataset = db.getDataFromTable(selectedTable);
datatable = dataset.Tables[selectedTable];
datagridAdmin.ItemsSource = datatable.DefaultView;
当DataGrid中的选择发生更改时,我将“提交”按钮设置为活动状态,并调用以下代码:

db.updateTable(selectedTable, datatable);
请注意,“db”是数据库类之外的一个实例。方法如下:

public bool updateTable(String tableName, DataTable datatable)
{
    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(thisConnection.ConnectionString, SqlBulkCopyOptions.CheckConstraints))
    {
        //Set destination table name
        //to table previously created.
        bulkcopy.DestinationTableName = tableName;

        try
        {
            thisCommand = new SqlCommand("DELETE FROM " + tableName, thisConnection);
            thisCommand.ExecuteNonQuery();
            bulkcopy.WriteToServer(datatable);
        }
        catch (Exception ex)
        {
            logger.WriteLine(applicationName, ex.Message);
        }
    }
}
但问题是,第一列是一个自动增量ID,每次我提交更改后的DataGrid时它都会不断增加。 难道没有更好的办法吗

谢谢


PS:我正在使用WPF中的C在Visual Studio 2010中进行编码。

简而言之,对于您提供的方法,最好在调用大容量副本之前使用Truncate table方法,这会将标识列重置为0:

thisCommand = new SqlCommand("TRUNCATE TABLE " + tableName, thisConnection);
但是,这两种方法都会导致数据库中的外键出现问题。我不确定您是如何在数据库类中检索数据的,但我会考虑使用更新数据库,而不是在每次更新时删除和重新插入所有数据

编辑

进一步解释我对SqlCommandBuilder的建议

下面这样的ViewModel应该允许使用SqlCommandBuilder注意:这大大减少了,实际上这需要更好的验证、异常和事件处理,但大致的想法是:

public class YourViewModel
{
    private SqlDataAdapter adapter;
    private DataTable table;
    private SqlCommandBuilder commandBuilder;
    public DataTable Table { get { return table; } set { table = value; } }
    public void LoadTable(string connectionString, string tableName, int[] primaryKeyColumns)
    {
        adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", tableName), connectionString);
        table = new DataTable();
        adapter.Fill(table);
        List<DataColumn> primaryKeys = new List<DataColumn>();
        for (int i = 0; i < primaryKeyColumns.Length; i++) 
        {
             primaryKeys.Add(table.Columns[primaryKeyColumns[i]]);
        }
        table.PrimaryKey = primaryKeys.ToArray();
        commandBuilder = new SqlCommandBuilder(adapter);
        commandBuilder.GetUpdateCommand();
    }
    public int Update()
    {
        if (table == null || table.Rows.Count == 0 || adapter == null) 
        {
             return 0;
        }
        if (table.PrimaryKey.Length == 0)
        {
            throw new Exception("Primary Keys must be defined before an update of this nature can be performed");
        }
        else
        {
            return adapter.Update(table);
        }
    }
}

将表属性绑定到网格视图,然后在需要时调用Update方法。您甚至可以将更新绑定到表的rowchanged事件等,以自动更新数据库。有一篇关于WPF、数据网格和数据库集成的相当好的文章。

您所说的TRUNCATE选项不起作用。它表示更新成功,但刷新后仍保留旧值。关于SqlCommandBuilder,我试图实现它,但是当它需要一个在更新之前我不使用的SqlCommand时,我如何让它生成一个更新命令呢?我已经更正了我的truncate语句,并尝试扩展我使用SqlDataAdapter的意思。虽然在没有看到源代码的情况下很难准确地说出如何使用它,但我已经尽可能地做到了通用。非常感谢。我想这已经足够了。下周我将试着找出你的例子。如果它不起作用,那么我会回来解释问题。