2016-12-18 1 views
0

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

Сначала я прочитал всю базу данных и сохранил ее в локальной таблице данных, но я хочу прочитать все новые строки, которые добавляются в базу данных. Вот как я пытаюсь прочитать новые строки:

string accessDB1 = string.Format("SELECT * FROM {0} ORDER BY ID DESC", tableName); 
setupaccessDB(accessDB1); 

int dTRows = localDataTable.Rows.Count + 1; 
localDataTable.Rows.Add(); 

using (readNext = command.ExecuteReader()) 
{ 
    while (readNext.Read()) 
    { 
     for (int xyz = 0; xyz < localDataTable.Columns.Count; xyz++) 
     { 
      // Code 
     } 
     break; 
    } 
} 

Если только одна строка добавляется в таймере, то это работает отлично, но при добавлении нескольких строк это читает только последнюю строку.

Так что я могу прочитать все добавленные строки.

Я использую OledbDataReader.

Заранее спасибо

+0

DataAdapter будет делать, что для вас – Plutonix

+0

новых строк? Как вы отслеживаете новые строки? Есть ли личность или что-то, что вы затем храните, когда вы «читаете» это –

+0

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

ответ

1

Вашей немедленной проблемы лежит здесь:

while (readNext.Read()) 
{ 
    doSomething(); 
    break; 
} 

Это то, что ваш цикл в основном сводится к тому. То, что break собирается выйти из цикла после обработки первого элемента, независимо от количества элементов.

Первый элемент, в данном случае, вероятно, будет последним добавленным (как вы заявите его), так как сортируете по убыванию ID.

С точки зрения чтения только недавно добавленных строк существует множество способов сделать это, некоторые из которых будут зависеть от используемой СУБД.

Возможно, самым простым и самым переносимым было бы добавить дополнительный столбец processed, который установлен в значение false, когда сначала добавляется строка.

Таким образом, вы можете просто получить запрос, который ищет эти записи, и для каждого обрабатывать их и устанавливать столбец в true.

На самом деле вы можете использовать триггеры для этого (принудительно установите флажок на вставку), что также открывает возможность сделать это с обновлениями.

Отслеживание удалений немного сложнее, но еще достижимо. У вас может быть триггер, который фактически записывает запись в отдельную таблицу, прежде чем удалять ее, чтобы ваш код обработки также имел доступ к этим деталям.

+0

Когда я пробую ваш код, все из базы данных читается вместо новых строк. (Я избавился от «перерыва»). Есть ли ссылка, где я могу узнать, как использовать операторы Select, до сих пор я изучил ее на основе того, как другие люди использовали операторы Select. –

+0

@ghostwar, да, это будет эффект, так как ваш запрос запрашивает все записи. Добавили дополнительную информацию о возможных способах устранения этой другой проблемы. – paxdiablo

1

Для большинства таблиц первичный ключ основан на инкрементном значении. Это может быть очень простое целое число, которое увеличивается на единицу, но также может быть основано на datetime guid.

В любом случае, если вы знаете идентификатор последней записи. Вы можете попросить все записи, имеющие «более высокий» идентификатор. Таким образом, вы получаете новые записи, но как насчет обновленных записей? Если вам также нужны те, которые вы, возможно, захотите использовать столбец, содержащий значение datetime.

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

Некоторые базы данных, такие как Microsoft SQL Server, также предоставляют более сложные варианты в этом отношении. Вы можете использовать уведомления о запросах через службы брокера или включить отслеживание изменений в своей базе данных.Последний может даже указать, что было последним действием на запись (вставка, обновление или удаление).

0

следующие работы

using (readNext = command.ExecuteReader()) 
{ 
    while (readNext.Read()) 
    { 
     abc = readNext.FieldCount; 
     for (int s = 1; s < abc; s++) 
     { 
      var nextValue = readNext.GetValue(s); 
     } 
    } 

} 

For Loop читает текущую строку, а затем в While Loop переходит на следующую строку

Смежные вопросы