Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridview отображает удаленные в БД строки, SqlDataAdapter.Fill и deleted rows 
V
    Опции темы
grafviktor
Дата 5.2.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Есть ДатаГридВью, связанный с БД. Проблема в том, что после вызова метода Fill в нем остаются строки, которых в БД уже нет, т.е. все изменения отображаются как надо, но удаленные строки с БД не синхронизируются. DataSource для DataGridView заполняется следующим образом:
Код

adapter.Fill(ds, srcTable);


Подозреваю, что дело в какой нибудь ерунде, но сам разобраться не смог. Может кто сталкивался и знает. Если ситуация не совсем стандартная, могу выложить весь код.

Забыл добавить: если удалить строку непосредственно из DataGridView, то все проходит нормально.

Это сообщение отредактировал(а) grafviktor - 5.2.2010, 16:51
PM MAIL   Вверх
KuMa1104
Дата 6.2.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Здравствуйте.
Ам не совсем понимаю зачем вам столь сложный механизм удаления. Но тем не менее либо подпишетесь на событие удаления либо киньте на форму кнопку и там код для обновления. Самый простои способ это просто заново заполнить ваш грид
Код

  private void button1_Click(object sender, EventArgs e)
        {
            this.houseTemplateTableAdapter.Fill(this.houseDBDataSet.HouseTemplate);
        }



Это сообщение отредактировал(а) KuMa1104 - 6.2.2010, 00:46


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
grafviktor
Дата 8.2.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Так в том то и дело, что я пытаюсь обновить грид с помощью метода Fill, но по какой то причине там остаются строки, которых в БД уже нет. Если другой пользователь редактирует строку, после вызова метода fill я вижу все изменения, а вот если другой пользователь удаляет строку, в гриде она у меня так и продолжает висеть, и так до перезапуска программы.
PM MAIL   Вверх
mrbrooks
Дата 8.2.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 5
Всего: 306



grafviktor, а вы уверены что в БД действительно записи нет? 
Покажите, как удаляете запись из БД.
PM MAIL   Вверх
grafviktor
Дата 8.2.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Пробовал даже вручную из БД SQL запросом, запись продолжает висеть в гриде, хотя sql показывает что её нет. И ещё нюанс - если я удаляю запись из под конкретного пользователя в программе, она исчезает и в БД и в гриде этого пользователя, но эта же запись остается в гридах других пользователей пока они не перезапустили программу.
PM MAIL   Вверх
grafviktor
Дата 8.2.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



На всякий случай добавлю, что я использую БД MySQL и MySQLConnector NET v.6.2.2
Весь код программы:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;

namespace WorkBook {
    //Код формы
    public partial class MainFrm : Form { 

        SQLEngine sql;
        DataSet ds;
        BindingSource bs;
        String MainTable = "Partners";

        public MainFrm() {
            InitializeComponent();
        }

        private void MainFrm_Load(object sender, EventArgs e) {
            sql = new SQLEngine("SERVER=localhost; DATABASE=rs_AddressBook; UID=workbook; PASSWORD=123; Character Set=utf8",
                "SELECT id, Name, Address, Phone, Contract FROM Partners ORDER BY name"); 
            ds = new DataSet();

            UpdateDataSet();

            ds.Tables[0].Columns[0].AutoIncrement = true;
            ds.Tables[0].Columns[0].AutoIncrementSeed = GetLastIndex();
            ds.Tables[0].Columns[0].AutoIncrementStep = 1;

            bs = new BindingSource(ds, "Partners");

            dgvPartnersList.AutoGenerateColumns = false;
            dgvPartnersList.DataSource = bs;
            DataGridViewColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "Name";
            column.Name = "Наименование";
            column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvPartnersList.Columns.Add(column);

            txName.DataBindings.Add("Text", bs, "Name");
            txAddress.DataBindings.Add("Text", bs, "Address");
            txPhone.DataBindings.Add("Text", bs, "Phone");
            txContract.DataBindings.Add("Text", bs, "Contract");
        }

        private void btnExit_Click(object sender, EventArgs e) {
            Application.Exit();
        }

        private void btnSave_Click(object sender, EventArgs e) {
            bs.EndEdit(); 
            Save();
        }

        private void Save() {
            sql.Update(ds.GetChanges(),MainTable);
        }

        //Получаем следующий порядковый номер ключевого поля
        public int GetLastIndex() {
            try {
                return Convert.ToInt32(ds.Tables["Partners"].Select(string.Empty, "id DESC")[0]["id"]) + 1;
            } catch (IndexOutOfRangeException) {
                return 1;
            }
        }

        // Обращаемся к классу sql для перезаполнения грида
        private void UpdateDataSet() {
            sql.Fill(ref ds, MainTable);
        }

        // Обработчик кнопки создания нового элемента
        private void btnNew_Click(object sender, EventArgs e) {
            ds.Tables[0].Columns[0].AutoIncrementSeed = GetLastIndex();
            DataRow row = ds.Tables["Partners"].NewRow();
            row["Name"] = "Новый элемент";
            ds.Tables["Partners"].Rows.Add(row);
            dgvPartnersList.CurrentCell = dgvPartnersList.Rows[dgvPartnersList.Rows.Count - 1].Cells[0];
            bs.EndEdit();
            sql.Update(ds.GetChanges(), MainTable);
            ds.AcceptChanges();
        }

        // Обработчик кнопки удаления
        private void btnDelete_Click(object sender, EventArgs e) {
            if (MessageBox.Show("Вы уверены что хотите удалить элемент ?", "Предупреждение",
                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) {
                
                dgvPartnersList.Rows.Remove(dgvPartnersList.CurrentRow);
                bs.EndEdit();
                sql.Update(ds.GetChanges(), MainTable);
                ds.AcceptChanges();
            }
        }

        // При каждом клике на грид обновляем его
        private void dgvPartnersList_MouseDown(object sender, MouseEventArgs e) {
            UpdateDataSet();
        }
    }

.
.
.
using MySql.Data;
using MySql.Data.MySqlClient;

    // Класс для работы с mysql
    class SQLEngine {
        MySqlConnection cn;
        MySqlDataAdapter adapter;
        MySqlCommandBuilder cb;

        public SQLEngine(string connectionString, string selectCmd) {
            cn = new MySqlConnection(connectionString);
            MySqlCommand cmd = new MySqlCommand(selectCmd, cn);
            adapter = new MySqlDataAdapter(cmd);
            adapter.SelectCommand = cmd;
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

            cb = new MySqlCommandBuilder(adapter);
            adapter.UpdateCommand = cb.GetUpdateCommand();
            adapter.DeleteCommand = cb.GetDeleteCommand();
        }

        public void Fill(ref DataSet ds, string srcTable) {
            adapter.Fill(ds, srcTable);
        }

        public void Update(DataSet d, string dstTable) {
            adapter.FillLoadOption = LoadOption.OverwriteChanges;
            adapter.Update(d,dstTable);
        }
    }
}

PM MAIL   Вверх
grafviktor
Дата 8.2.2010, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Вопрос закрыт.
На 111 строке добавил оператор
Код

ds.Clear();

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.