【问题标题】:Can't update Local Database using WPF Datagrid & DataAdapter无法使用 WPF Datagrid 和 DataAdapter 更新本地数据库
【发布时间】:2015-07-22 13:44:18
【问题描述】:

我正在尝试将 DataGrid 中所做的更改反映到我的本地数据库(在本例中为 SQL Server Compact Edition),但它失败了。代码如下:

        SqlCeConnection conn;
        SqlCeDataAdapter dataAdapter;

        public MainWindow()
        {
        InitializeComponent();
        Init();
    }

    public void Init()
    {
        try
        {
            conn = new SqlCeConnection(@"Data Source = DataModel.sdf");
            dataAdapter = new SqlCeDataAdapter("Select * from Members", conn);
            SqlCeCommandBuilder commandBuilder = new SqlCeCommandBuilder(dataAdapter);
            DataTable dataTable = new DataTable();
            dataAdapter.Fill(dataTable);
            dataTable.RowChanged += dataTable_RowChanged;
            dataTable.RowDeleted += dataTable_RowDeleted;
            membersDataGrid.ItemsSource = dataTable.DefaultView;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }


    }

    void dataTable_RowDeleted(object sender, DataRowChangeEventArgs e)
    {
        dataAdapter.Update(sender as DataTable);
    }

    void dataTable_RowChanged(object sender, DataRowChangeEventArgs e)
    {
        dataAdapter.Update(sender as DataTable);

    }

membersDataGrid 是 UI 中 DataGrid 视图的名称。我做错什么了吗? 在此先感谢:-)

【问题讨论】:

  • 您将发送者作为参数传递给 dataAdapter.Update()
  • @jstreet 我已经检查了发件人。这是最新修改的表。应该作为新表存储在数据库中的那个。
  • 通常您会为此目的使用事件参数 DataRowChangeEventArgs.Row。
  • 哇...实际上它确实有效...我复制了您的代码,但只是使用常规 SQL Server(不是 CE)并且它确实有效,尽管我不会这样做。尝试在 Visual Studio 之外执行您的代码,否则您的数据库可能会在您的编译/执行周期中被覆盖,您将永远无法看到您的更改。我会发布对我有用的代码,也许它会对你有所帮助。
  • 另外,请注意,当您从现有数据库添加数据源时,我使用的是 Visual Studio 为您创建的强类型数据集,这只是个人喜好。另一点:注意我在 table_RowChanged 事件处理程序中使用本地适配器,因为您的代码正在使用类实例变量。在这种情况下,更推荐使用本地适配器。

标签: c# wpf datagrid ado.net


【解决方案1】:

这是对我有用的代码。它与您的相似,除了使用我的 localDB 数据库(不是 CE)。另外,请确保在 VS 之外测试您的代码,否则数据库文件可能会在您的编译/执行周期中被覆盖,您将永远无法看到您的更改反映在数据库中。

private void DataGrid_Loaded(object sender, RoutedEventArgs e)
{
    string connstr = ConfigurationManager.ConnectionStrings["WpfApplication14.Properties.Settings.NorthwindConnectionString"].ToString();
    SqlConnection conn = new SqlConnection(connstr);
    CustomersTableAdapter adapter = new CustomersTableAdapter();
    NorthwindDataSet.CustomersDataTable table = new NorthwindDataSet.CustomersDataTable();

    adapter.Fill(table);
    dataGrid1.ItemsSource = table.DefaultView;

    table.RowChanged += table_RowChanged;
}

void table_RowChanged(object sender, System.Data.DataRowChangeEventArgs e)
{
    using (CustomersTableAdapter adapter = new CustomersTableAdapter())
    {
        adapter.Update(sender as NorthwindDataSet.CustomersDataTable);
    }
}

【讨论】:

  • 感谢您花时间寻找问题。昨天我意识到问题出在表的主键上。主键列必须始终驻留在 DataTable 中,否则 DataAdapter 将丢失行跟踪。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2020-04-26
  • 1970-01-01
  • 2013-07-25
  • 2013-12-25
  • 2015-04-23
相关资源
最近更新 更多