Вставка не передана в базу данных - PullRequest
1 голос
/ 26 июля 2010

У меня возникли проблемы с работой моего набора данных.

У меня есть база данных MDB в фоновом режиме и я создал из нее набор данных.Теперь я создал новый метод, который позволяет мне создать нового пользователя в таблице.

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

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

// DataSet1 uses the connection to the Database.mdb
// Created by the Designer

// The Users table has 3 columns, id, name and password

DataSet1 set = new DataSet1();
UsersTableAdapter adap = new UsersTableAdapter();
DataSet1.UsersRow row = set.Users.AddUsersRow("asd", "asd");
int count = adap.Insert("das", "das");
MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());
count = adap.Update(set.Users);
set.AcceptChanges();
MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());

// The Messagebox shows: "Added: 1"
// The second one: "Unchanged: 1"

MessageBox.Show(set.Users.Rows.Count.ToString());

// Returns "2"...

1 Ответ

2 голосов
/ 26 июля 2010

Не зная слишком много о вашем коде, попробуйте прочитать это как из MSDN:

http://msdn.microsoft.com/en-us/library/ms233812(v=VS.80).aspx

Обновление: с наборами данных, что обычно происходит(предполагая, что набор данных заполнен), строки будут добавлены, отредактированы или удалены в коде.Эти строки будут иметь соответствующий RowState, обозначающий их как добавленные, отредактированные, удаленные или неизмененные.В течение .Update связанный адаптер таблицы вместе со связанными командами вставки / обновления / удаления будет выполнять итерацию строк и выполнять команду в данной строке в зависимости от состояния строки.Когда строки были повторены, вызывается .AcceptChanges, возвращая состояние строки в состояние по умолчанию.

Если вы вызываете AcceptChanges перед обновлением, то ничего не произойдет.RowState каждой строки будет потеряно, поэтому .Update не будет иметь необходимой информации, необходимой для обновления базы данных.Если у вас есть специальный код для переноса всего этого в транзакцию, то вам нужно убедиться, что вы зафиксировали транзакцию.

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

Обновление 2: код выглядит хорошо для меня, хотя вы этого не делаетеНе нужно вызывать Insert на адаптере или AcceptChanges после обновления (последнее выполняется автоматически).Это заставляет меня поверить, что в вашей команде вставки SQL есть ошибка - попробуйте извлечь SQL, используемый командой, и запустить его вручную для базы данных.

Обновление 3: работает следующий кодхорошо для меня:

static void Main(string[] args)
    {
        db1DataSet set = new db1DataSet();
        set.Users.AddUsersRow("asd", "asd");

        foreach (DataRow row in set.Users.Rows)
        {
            object foo = row.RowState; // Confirm row state in debugger.
        }

        UsersTableAdapter adap = new UsersTableAdapter();
        adap.Update(set.Users);

        Console.Read();
    }
...