Отправить DataTable для доступа к базе данных с помощью C # - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть таблица (около 250 тыс. Строк) в Access db с датой, временем и именем (другие столбцы не имеют значения для этой проблемы). Мне нужно получить только первую (или последнюю) дату / время для значения имени и отправить его в новую таблицу.

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

Я также пытался прочитать данные из БД в DataTable, просматривая и удаляя ненужные строки, но я не могу отправить этот отредактированный DataTable обратно в БД. Аналогично этому: Как вставить данные в Microsoft Access?

using(OleDbConnection con = new OleDbConnection(ConnectionString))
{
    SQL = "Select * From OriginalTable";
    var adapter = new OleDbDataAdapter();
    adapter.SelectCommand = new OleDbCommand(SQL, con);
    var cbr = new OleDbCommandBuilder(adapter);

    try
    {
        con.Open();

        DataTable dtFilter = new DataTable();
        adapter.Fill(dtFilter);
        string id = dtFilter.Rows[dtFilter.Rows.Count - 1][4].ToString();
        for(int i = dtFilter.Rows.Count - 2; i >= 0; i--)
        {
            DataRow dr = dtFilter.Rows[i];
            if(dtFilter.Rows[i][4].ToString() == id)
            {
                dr.Delete();
            }
            else
            {
                id = dtFilter.Rows[i][4].ToString();
            }
        }
        dtFilter.AcceptChanges(); // DataTable looks as I want
        adapter.Update(dtFilter); // Returns 0 
    }
    catch(OleDbException ex)
    {
        MessageBox.Show(ex.Message, "OledbException Error");
    }
    catch(Exception x)
    {
        MessageBox.Show(x.Message, "Exception Error");
    }
}

Я ожидаю экспортировать dtFilter в Access db. Почему возвращается 0?

Я открыт для оператора SQL, если он быстрый.

UPDATE: Оператор SQL, используемый для выбора первой или последней записи

SELECT DISTINCT 
    cdate(Format(t.DateOS + t.TimeOS, 'dd.MM.yyyy HH:mm:ss')) AS DateTimeOS, 
    cdate(Format(t.DateOS, 'dd.MM.yyyy ')) AS DateOS, 
    cdate(Format(t.TimeOS, 'HH:mm:ss')) AS TimeOS, 
    t.EP AS EP, t.ID AS ID 
FROM TestFirstLast AS t 
WHERE t.EP = 'L100' 
    AND (((t.DateOS + t.TimeOS) > #1/1/2016 12:00:00 AM# AND (t.DateOS + t.TimeOS) <= #3/1/2016 12:00:00 AM#)) 
    AND NOT EXISTS(SELECT 1 FROM TestFirstLast AS t2 WHERE t2.EP = t.EP AND t2.ID = t.ID AND (t2.DateOS < t.DateOS OR t2.DateOS = t.DateOS AND t2.TimeOS < t.TimeOS))

ХОРОШЕЕ РЕШЕНИЕ: Я нашел хорошее описание проблемы и решения здесь

1 Ответ

0 голосов
/ 10 апреля 2019

Чтобы использовать метод .Update , необходимо предоставить команду обновления SQL.

OleDbDataAdapter предоставляет

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Если вы не устанавливаете соответствующую команду, DataAdapter не знает, что делать с вашими данными.

Посмотрите на OleDbDataAdapter Class

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