Member 10558090 Ответов: 1

Чтение из файла-помещать только новые данные в таблицу SQL


Всем привет,

У меня есть файл, в который постоянно добавляются записи. Я создаю приложение, которое 2 или 3 раза в день берет файл, читает с помощью TextFieldParser и помещает данные в SQL-таблицу.

Моя проблема заключается в следующем: в первый раз все данные вставляются в таблицу SQL. Во второй раз мне нужно, чтобы вставлялись только новые данные.

Как лучше всего это сделать?

с уважением

Что я уже пробовал:

Я создал временную таблицу для своего оригинала и попытался использовать NOT IN statment, чтобы иметь только те данные, которые не вставляются. Но, я должен использовать элемент управления на текстовой переменной, и из того, что я понимаю, не в не работает.

Tomas Takac

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

Member 10558090

В качестве альтернативы я мог бы это сделать. Возьмите последнюю запись таблицы, основанную на полях "дата" и "час", и начните чтение оттуда. Это возможно?

Tomas Takac

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

Richard Deeming

Вы имеете в виду, что у вас есть столбец, определенный как text введите SQL? Это устарело и будет удалено в будущей версии:
ntext, text и image (Transact-SQL)[^]

Попробуйте использовать varchar(max) вместо.

Member 10558090

Наверное, вы правы. Это сэкономит мне много времени. Я изменил varibile в тип varchar
и используйте этот запрос: вставьте в ProvaTimbrature (Data, Ora, Codice_Tessera, Verso, Giustificativo, Tipo_Operazione, Lettore, Cognome, Nome, Causale, Matricola_Dipendente, Campo1, Campo2, Controllo) выберите Data, Ora, Codice_Tessera, Verso, Giustificativo, Tipo_Operazione, Lettore, Cognome, Nome, Causale, Matricola_Dipendente, Campo1, campo2, CONTROLLO от Tmpprovatimbrature, где Tmpprovatimbrature.Controllo NOT IN (выберите Controllo из ProvaTimbrature)
Наконец, это работает.

1 Ответов

Рейтинг:
2

CPallini

У вас есть несколько вариантов:

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


Member 10558090

"Запишите в свою базу данных последний размер файла и в следующий раз начните чтение с такой позиции"

Какое утверждение мне нужно использовать?

CPallini

Это зависит от класса, который вы используете для чтения файла. Например, Чтениетекста класс обеспечивает только С readline или Readblock методы перемещения указателя файла.