Вставка не согласилась на базу данных

Я испытываю некоторые затруднения, заставляя мой DataSet работать.

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

Но когда я называю его, ничего не происходит. Никакие исключения, никакие ошибки и я даже не добираемся "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
задан Luke Girvin 21 September 2012 в 16:11
поделиться

1 ответ

Не зная слишком много о вашем коде, попробуйте прочитать это руководство из 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();
    }
2
ответ дан 2 September 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: