Почему DataAdapter.Update () не обновляет базу данных - PullRequest
0 голосов
/ 13 апреля 2020

В моей форме есть DataGridView, и у меня есть кнопка сохранения. И DataAdapter, и DataSet генерируются автоматически. Я хочу использовать DataAdapter.Update () для обновления своей базы данных, но, похоже, ничего не изменилось после того, как я обновил DataGridView, когда открываю таблицу в .mdf или снова создаю решение.

Я знал, что это было задано и прочитайте несколько постов, пытаясь найти решения, но они не работают.

  1. Я установил для свойства файла .mdf «Копировать в выходной каталог» значение «Копировать, если новее»
  2. BindingSource и BindingNavigator работают успешно.

Пример кода

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.myTableTableAdapter.Fill(this.myDatabaseDataSet.myTable);
            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(myTableTableAdapter.Adapter);
            myTableTableAdapter.Adapter.InsertCommand = sqlCommandBuilder.GetInsertCommand();
            myTableTableAdapter.Adapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand();
            myTableTableAdapter.Adapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();

        }

        private void SaveSToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                bindingSource1.EndEdit();
                myTableTableAdapter.Adapter.Update(myDatabaseDataSet.myTable);
                MessageBox.Show("Succeed");
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message, "Failed");
            }

        }
    }
}

1 Ответ

0 голосов
/ 15 апреля 2020

Только что решил эту проблему. Кто-то с той же проблемой может ссылаться на это. Почему не удается сохранить изменения в базе данных? Ответ Стива весьма полезен для понимания этой проблемы.

Я изменил свою базу данных, но когда я подключаю источник данных, он просто копируется снова, поэтому Кажется, обновление завершилось неудачно.

Вы можете написать соединение вручную, изменив | Directory | где ваша база данных на самом деле. Или сделайте что-то вроде этого:

string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"\bin\Debug\")
            || dataDir.EndsWith(@"\bin\Release\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

Но я не рекомендую этого, потому что это может изменить вашу исходную базу данных при отладке. Это должно быть только изменение моей базы данных в папке bin при сохранении исходной базы данных без изменений.

Вам нужно просто установить для свойства .mdf file Copy to directory значение Copy if newer или Copy Never ( В этом случае добавьте скрипт для копирования файла в папку bin \ debug, только если он не существует). И не зацикливайтесь на исходном .mdf в менеджере ресурсов.

И другие примечания:

  • Строки, подобные myTableTableAdapter.Adapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();, не нужны.

    При связывании с DataAdapter DbCommandBuilder автоматически генерирует свойства InsertCommand, UpdateCommand и DeleteCommand объекта DataAdapter, если они являются нулевыми ссылками. Если команда уже существует для свойства, используется существующая команда. MSDN

  • Мне нужно проверить перед звонком BindingSource.EndEdit()

this.Validate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...