Лучшие практики для загрузки файлов в базу данных - PullRequest
6 голосов
/ 13 ноября 2008

Я ищу какие-либо рекомендации или идеи о том, как создать интерфейс с БД из веб-приложения .NET для загрузки данных из файлов Excel. Должен ли я использовать механизм, который позволяет загружать все записи и помечать ошибки, или использовать механизм, который останавливает загрузку при возникновении ошибки.

Раньше мне никогда не приходилось сталкиваться с такого рода требованиями, поэтому любая помощь была бы супер!

Спасибо

Ответы [ 4 ]

5 голосов
/ 13 ноября 2008

Я бы попробовал следующий подход, который хорошо работал в прошлом.

  1. Разрешить пользователю загружать файл, помещать его куда-нибудь на диск.
  2. Привязать результаты файла к некоторой сетке (вы можете подключиться к файлам Excel, используя ODBC / OLE DB, используя традиционные объекты Connection / Command).
  3. Применение проверки к строкам в сетке на основе некоторого набора бизнес-правил (данные в Excel обычно довольно грязные).
  4. Разрешить пользователю обновлять значения в сетке и исправлять ошибки проверки.
  5. Когда все данные являются кошерными, и пользователь доволен ими, выполнить массовую вставку в транзакцию.
  6. Если случится что-то «плохое», отката и представьте отзывы пользователей.
2 голосов
/ 13 ноября 2008

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

  • API массовой загрузки ADO.Net - используйте API массовой загрузки, чтобы поставить его в стадии Таблица. Фрагмент ниже показывает процесс, чтобы открыть файл .CSV и программно загрузить его в промежуточный стол.

.

  public void Load() {
        bool OK = File.Exists(_filename);
        if (OK) {
            string sql = String.Format("Select * from {0}", FileName);
            OleDbConnection csv = new OleDbConnection();
            OleDbCommand cmd = new OleDbCommand(sql, csv);
            OleDbDataReader rs = null;
            SqlConnection db = null;
            SqlCommand clear = null;

            SqlBulkCopy bulk_load = null;
            try {
                    // Note two connections: one from the csv file
                    // and one to the database;
                    csv = new OleDbConnection();
                    csv.ConnectionString = ConnectionString;
                    csv.Open();
                    cmd = new OleDbCommand(sql, csv);
                    rs = cmd.ExecuteReader();

                    // Dung out the staging table
                    db = // [Create A DB conneciton Here]
                    clear = new SqlCommand("Truncate table Staging", db); // Left to the reader
                    clear.ExecuteNonQuery();

                   // Import into the staging table
                    bulk_load = new SqlBulkCopy(db);
                    bulk_load.DestinationTableName = Destination; // Actually an instance var
                    bulk_load.WriteToServer(rs);
                } catch (Exception ee) {
                    string summary = ee.Message;
                    string detail = ee.StackTrace;
                    //Notify(DisplayType.error, summary, detail);
                } finally {
                    if (rs != null) rs.Close();
                    if (csv != null) csv.Close();
                    if (bulk_load != null) bulk_load.Close();
                }
            }
        }
  • Используйте BCP или SSIS для его импорта, либо прямо из таблицы или из файла .CSV.
1 голос
/ 13 ноября 2008

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

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

0 голосов
/ 13 ноября 2008

Вы хотите поместить файлы Excel в БД в виде большого двоичного объекта? или вы хотите разобрать файлы и поместить записи в файлы в базу данных?

Я предполагаю, что это последнее.

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

Я бы попробовал сделать гибридное решение ... если есть только несколько ошибок, покажите экран, чтобы исправить эти ошибки, чтобы пользователь мог быстро двигаться дальше. Если есть куча ошибок, вы можете просто сделать это, и пользователь должен повторить попытку.

Насколько БД. Либо есть отдельная таблица, в которую загружаются данные, до тех пор, пока они не будут проверены и получены с вашими "реальными" данными, либо столбец UploadUniqueId, чтобы вы могли откатить любую загрузку без особых хлопот.

удалить tableName, где UploadUniqueId = 'GUID'

...