无法将数据从 DataTable 上传到 WPF .NET 5.0 中的数据库?
Can't upload data from DataTable to Database in WPF .NET 5.0?
我正在编写一个 WPF C# .NET 5.0 应用程序,用于将数字从公制转换为英制(反之亦然)。我有一个奇怪的问题,数据没有上传到数据库。我成功地从数据库下载了数据,但我无法在我的数据网格中显示它。
数据库通过DataSetProj.xsd 文件连接。
这是我的数据库的样子:
我的应用程序有 3 个选项卡,一个用于转换器,一个用于数据网格,一个用于其他内容。每当转换器中的输入发生变化时,它会自动转换,并添加一条记录到 Stats
table.
我的应用程序正确地从 Converters
、MetricUnits
和 ImperialUnits
table 中读取数据(不确定 Stats
,因为这个 table 为空)。
仅供参考 这些是我用来与 DB 通信的字段:
DataSetProj DBProj = new DataSetProj();
DataSetProjTableAdapters.ConvertersTableAdapter convertersTableAdapter = new();
DataSetProjTableAdapters.StatsTableAdapter statsTableAdapter = new();
DataSetProjTableAdapters.ImperialUnitsTableAdapter imperialUnitsTableAdapter = new();
DataSetProjTableAdapters.MetricUnitsTableAdapter metricUnitsTableAdapter = new();
DataSetProjTableAdapters.StatsViewTableAdapter statsViewTableAdapter = new();
这是启动时代码:
convertersTableAdapter.Fill(DBProj.Converters);
statsTableAdapter.Fill(DBProj.Stats);
imperialUnitsTableAdapter.Fill(DBProj.ImperialUnits);
metricUnitsTableAdapter.Fill(DBProj.MetricUnits);
当我想向我的数据库中添加一条记录时,此代码调用:
private void addStat(double input, double output)
{
DataSetProj.ConvertersRow usedConverter = DBProj.Converters.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).ToString()).First();
DataSetProj.MetricUnitsRow metricUnit;
// this if statement exists, because ConvertLength has multiple metric units, like kilometre, metre, etc.
if (ConvertersList.SelectedItem is ConvertLength)
{
metricUnit = DBProj.MetricUnits.Where(x => x.NameOf == BoxUnitChoice.SelectedItem.ToString()).First();
}
else
{
metricUnit = DBProj.MetricUnits.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).MetricUnit(true)).First();
}
DataSetProj.ImperialUnitsRow imperialUnit = DBProj.ImperialUnits.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).ImperialUnit(true)).First();
DBProj.Stats.AddStatsRow(DBProj.Stats.Count, DateTime.Now, (metricToImperial ? 1 : 0), metricUnit, imperialUnit, usedConverter, input, output);
}
而且有效 - DBProj.Stats.Count 每次添加记录时都会增加。但是,当我切换到带有数据网格 (TabStats
) 的选项卡时,它根本不显示任何统计信息。它使用 StatsView
作为来源,而不是直接使用 Stats
(或者至少这是我希望它的工作方式)。
当我切换到 TabStats
:
时调用此代码
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((Tabs.SelectedItem as TabItem) == TabStats)
{
DBProj.Stats.AcceptChanges();
statsViewTableAdapter.Fill(DBProj.StatsView);
//neither of these 2 lines populate my datagrid
StatsDataGrid.ItemsSource = DBProj.StatsView;
//StatsDataGrid.ItemsSource = statsViewTableAdapter.GetData();
MessageBox.Show($"{DBProj.Stats.Count} this is stat count\n{DBProj.StatsView.Count} and this is statsView", "test");
}
}
这是我输入几个值后消息框的输出(注意数据网格是空的):
据我所知,数据似乎存储在 DBProj.Stats table 本地,但没有发送回我的数据库(StatsView
试图从中获取数据) .但是,.AcceptChanges()
不应该发送我所做的任何更改吗?
如何使用 WPF .NET 5.0 将数据发送回数据库?我发现的所有教程要么使用了 EF,要么只引用了 .AcceptChanges()
方法。
编辑:我忘了添加,但数据永远不会保存在数据库中 - 每次我 运行 程序时,Stats
都是空的。如上所述,我希望在切换到 TabStats
选项卡时保存它。
感谢@Andy 的启发,我设法解决了这个问题。我没有在数据 table 上使用 .AcceptChanges()
,而是不得不 .Update()
数据 table 适配器 - 我找到了 this 文档,它解释了如何将数据添加到现有数据 table 使用 SQL INSERT
命令。这是工作代码:
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((Tabs.SelectedItem as TabItem) == TabStats)
{
//DBProj.Stats.AcceptChanges();
statsTableAdapter.Update(DBProj.Stats);
statsViewTableAdapter.Fill(DBProj.StatsView);
StatsDataGrid.ItemsSource = DBProj.StatsView;
//StatsDataGrid.ItemsSource = statsViewTableAdapter.GetData();
MessageBox.Show($"{DBProj.Stats.Count} this is stat count\n{DBProj.StatsView.Count} and this is statsView", "test");
}
}
我正在编写一个 WPF C# .NET 5.0 应用程序,用于将数字从公制转换为英制(反之亦然)。我有一个奇怪的问题,数据没有上传到数据库。我成功地从数据库下载了数据,但我无法在我的数据网格中显示它。
数据库通过DataSetProj.xsd 文件连接。
这是我的数据库的样子:
我的应用程序有 3 个选项卡,一个用于转换器,一个用于数据网格,一个用于其他内容。每当转换器中的输入发生变化时,它会自动转换,并添加一条记录到 Stats
table.
我的应用程序正确地从 Converters
、MetricUnits
和 ImperialUnits
table 中读取数据(不确定 Stats
,因为这个 table 为空)。
仅供参考 这些是我用来与 DB 通信的字段:
DataSetProj DBProj = new DataSetProj();
DataSetProjTableAdapters.ConvertersTableAdapter convertersTableAdapter = new();
DataSetProjTableAdapters.StatsTableAdapter statsTableAdapter = new();
DataSetProjTableAdapters.ImperialUnitsTableAdapter imperialUnitsTableAdapter = new();
DataSetProjTableAdapters.MetricUnitsTableAdapter metricUnitsTableAdapter = new();
DataSetProjTableAdapters.StatsViewTableAdapter statsViewTableAdapter = new();
这是启动时代码:
convertersTableAdapter.Fill(DBProj.Converters);
statsTableAdapter.Fill(DBProj.Stats);
imperialUnitsTableAdapter.Fill(DBProj.ImperialUnits);
metricUnitsTableAdapter.Fill(DBProj.MetricUnits);
当我想向我的数据库中添加一条记录时,此代码调用:
private void addStat(double input, double output)
{
DataSetProj.ConvertersRow usedConverter = DBProj.Converters.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).ToString()).First();
DataSetProj.MetricUnitsRow metricUnit;
// this if statement exists, because ConvertLength has multiple metric units, like kilometre, metre, etc.
if (ConvertersList.SelectedItem is ConvertLength)
{
metricUnit = DBProj.MetricUnits.Where(x => x.NameOf == BoxUnitChoice.SelectedItem.ToString()).First();
}
else
{
metricUnit = DBProj.MetricUnits.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).MetricUnit(true)).First();
}
DataSetProj.ImperialUnitsRow imperialUnit = DBProj.ImperialUnits.Where(x => x.NameOf == (ConvertersList.SelectedItem as IConverter).ImperialUnit(true)).First();
DBProj.Stats.AddStatsRow(DBProj.Stats.Count, DateTime.Now, (metricToImperial ? 1 : 0), metricUnit, imperialUnit, usedConverter, input, output);
}
而且有效 - DBProj.Stats.Count 每次添加记录时都会增加。但是,当我切换到带有数据网格 (TabStats
) 的选项卡时,它根本不显示任何统计信息。它使用 StatsView
作为来源,而不是直接使用 Stats
(或者至少这是我希望它的工作方式)。
当我切换到 TabStats
:
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((Tabs.SelectedItem as TabItem) == TabStats)
{
DBProj.Stats.AcceptChanges();
statsViewTableAdapter.Fill(DBProj.StatsView);
//neither of these 2 lines populate my datagrid
StatsDataGrid.ItemsSource = DBProj.StatsView;
//StatsDataGrid.ItemsSource = statsViewTableAdapter.GetData();
MessageBox.Show($"{DBProj.Stats.Count} this is stat count\n{DBProj.StatsView.Count} and this is statsView", "test");
}
}
这是我输入几个值后消息框的输出(注意数据网格是空的):
据我所知,数据似乎存储在 DBProj.Stats table 本地,但没有发送回我的数据库(StatsView
试图从中获取数据) .但是,.AcceptChanges()
不应该发送我所做的任何更改吗?
如何使用 WPF .NET 5.0 将数据发送回数据库?我发现的所有教程要么使用了 EF,要么只引用了 .AcceptChanges()
方法。
编辑:我忘了添加,但数据永远不会保存在数据库中 - 每次我 运行 程序时,Stats
都是空的。如上所述,我希望在切换到 TabStats
选项卡时保存它。
感谢@Andy 的启发,我设法解决了这个问题。我没有在数据 table 上使用 .AcceptChanges()
,而是不得不 .Update()
数据 table 适配器 - 我找到了 this 文档,它解释了如何将数据添加到现有数据 table 使用 SQL INSERT
命令。这是工作代码:
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((Tabs.SelectedItem as TabItem) == TabStats)
{
//DBProj.Stats.AcceptChanges();
statsTableAdapter.Update(DBProj.Stats);
statsViewTableAdapter.Fill(DBProj.StatsView);
StatsDataGrid.ItemsSource = DBProj.StatsView;
//StatsDataGrid.ItemsSource = statsViewTableAdapter.GetData();
MessageBox.Show($"{DBProj.Stats.Count} this is stat count\n{DBProj.StatsView.Count} and this is statsView", "test");
}
}