【问题标题】:How to update all the changes from Datagrid to DB through TableAdapter.Update()如何通过 TableAdapter.Update() 更新从 Datagrid 到 DB 的所有更改
【发布时间】:2016-09-19 02:29:07
【问题描述】:

我正在使用 Visual Studio 2015 Enterprise,32 位版本。

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

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 的 DataSet 项,我将承包商表拖到设计面板中:

VS 2015自动生成了三个C#类:HR(它是一个强类型的DataSet,并且有三个内部类,包括一个强类型的DataTablecontractorDataTable,ant so on.)、contractorTableAdapterTableAdapterManager

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

然后,我将 Data Sources 选项卡中的承包商 Datagrid 拖到我的 WPF 主窗口中:

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

而我在 MainWindow 后面的 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);
            }
        }
    }
}

我期望的是,当我单击提交按钮时,我在该网格中所做的所有更改都会更新到数据库中,例如编辑记录和插入新记录。但事实上,我点击后什么都没有发生。

我从 MSDN 中找到了本教程:https://msdn.microsoft.com/en-us/library/ms171933(v=vs.140).aspx,但我没有在 MainWindow 类中的任何对象上找到 Validate() 或 EndEdit()。

我在 HR.design.cs 中的 Update() 方法中添加了一个断点,由 VS 2015 生成:

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);
    }
    //...
}

但这一点从未达到过。

任何帮助表示赞赏,在此先感谢。 google了很多,没发现有人这样做。

【问题讨论】:

  • 这个断点不会被命中,因为这个方法是用DebuggerNonUserCodeAttribute标记的。而是在单击事件中的 Update() 调用上放置一个断点。我怀疑每次运行项目时都会覆盖您的 mdf。
  • 我知道你的意思知道,如果我只是在/bin/debug中运行生成的.exe,它会将数据保存到该路径下的.mdf的副本中,并且似乎被覆盖了通过项目根目录下的副本。
  • 根据 MSDN,将“复制到输出字典”更改为“始终复制”以外的其他选项应该可以解决此问题。
  • 如果你都知道,那你在问什么?

标签: c# datagrid dataset tableadapter


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2012-02-23
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多