C# 如何通过TableAdapter.update()更新从Datagrid到DB的所有更改

C# 如何通过TableAdapter.update()更新从Datagrid到DB的所有更改,c#,datagrid,dataset,tableadapter,C#,Datagrid,Dataset,Tableadapter,我使用的是Visual Studio 2015 Enterprise,32位版本 首先,在我的项目中,我创建了一个基于服务器的数据库,并将其命名为HR.mdf,因此我使用LocalDB,顺便说一句,我将其复制到输出字典属性设置为复制(如果更新的话)。在这个数据库中,我只有一个简单的表,定义如下: CREATE TABLE [dbo].[contractor] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Name]

我使用的是Visual Studio 2015 Enterprise,32位版本

首先,在我的项目中,我创建了一个基于服务器的数据库,并将其命名为HR.mdf,因此我使用LocalDB,顺便说一句,我将其复制到输出字典属性设置为复制(如果更新的话)。在这个数据库中,我只有一个简单的表,定义如下:

CREATE TABLE [dbo].[contractor] (
    [Id]        INT          IDENTITY (1, 1) NOT NULL,
    [Name]      VARCHAR (50) NOT NULL,
    [IsMarried] BIT          NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
其次,我创建了一个名为HR的数据集项,我将contractor表拖到设计面板中:

VS 2015自动生成了三个C类:HR(它是一个强类型数据集,有三个内部类,包括一个强类型数据表contractorDataTable,ant等等),contractorTableAdapterTableAdapterManager

现在,我的解决方案如下所示:

第三,我随后将承包商的Datagrid从数据源选项卡拖到我的WPF主窗口:

运行程序时,主窗口如下所示:

我的主窗口后面的C#代码是:

using System;
using System.Windows;

namespace DataSetLab
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private DataSetLab.HR hR;
        private DataSetLab.HRTableAdapters.contractorTableAdapter hRcontractorTableAdapter;
        private System.Windows.Data.CollectionViewSource contractorViewSource;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            hR = ((DataSetLab.HR)(this.FindResource("hR")));
            // Load data into the table contractor. You can modify this code as needed.
            hRcontractorTableAdapter = new DataSetLab.HRTableAdapters.contractorTableAdapter();
            hRcontractorTableAdapter.Fill(hR.contractor);
            contractorViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("contractorViewSource")));
            contractorViewSource.View.MoveCurrentToFirst();
        }

        private void click(object sender, RoutedEventArgs e)
        {
            try
            {

                hRcontractorTableAdapter.Update(hR.contractor);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                hRcontractorTableAdapter.Fill(hR.contractor);
            }
        }
    }
}
但这一点从未达到


感谢您的帮助,提前谢谢。我在谷歌上搜索了很多,没有发现有人这样做。

@dotNet是对的。原因是.mdf被覆盖,并且我的“复制到输出字典”属性设置不起作用,因为您需要重新启动Visual Studio 2015。最后我意识到这不是一个好问题,对此我感到抱歉,但我没有找到关闭它的方法,所以我在这里发布了一个答案。

@dotNet是正确的。原因是.mdf被覆盖,并且我的“复制到输出字典”属性设置不起作用,因为您需要重新启动Visual Studio 2015。我最终意识到这不是一个好问题,对此我感到抱歉,但我没有找到关闭它的方法,因此我在这里发布了一个答案。

此断点将不会被命中,因为此方法标记为
DebuggerNonUserCodeAttribute
。在单击事件中的
Update()
调用上放置一个断点。我的怀疑是,每次运行项目时,您的mdf都会被覆盖。我知道您的意思。如果我只是在/bin/debug中运行生成的.exe,它会将数据保存到该路径下的.mdf副本中,并且似乎会被项目根目录下的副本覆盖。根据MSDN,将“Copy to Output dictionary”更改为“Copy always”以外的一些选项可以解决此问题。如果您了解所有内容,那么您的问题是什么?不会命中此断点,因为此方法标记为
DebuggerNonUserCodeAttribute
。在单击事件中的
Update()
调用上放置一个断点。我的怀疑是,每次运行项目时,您的mdf都会被覆盖。我知道您的意思。如果我只是在/bin/debug中运行生成的.exe,它会将数据保存到该路径下的.mdf副本中,并且似乎会被项目根目录下的副本覆盖。根据MSDN,将“复制到输出字典”更改为“始终复制”以外的其他选项可以解决此问题。如果您了解所有内容,那么您的要求是什么?
public partial class contractorTableAdapter : global::System.ComponentModel.Component {
    //...
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
    public virtual int Update(HR.contractorDataTable dataTable) {
        return this.Adapter.Update(dataTable);
    }
    //...
}