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





вы хотите поместить файлы Excel в БД в виде капли? или вы хотите проанализировать файлы и поместить записи из файлов в базу данных?
Я предполагаю, что это последнее.
Как пользователь я хотел бы иметь возможность знать, в чем заключаются ошибки, чтобы я мог исправить их и повторить попытку. Думаю, как я попробую еще раз, зависит от того, сколько данных я загружаю.
Я бы попытался сделать гибридное решение ... если есть только несколько ошибок, покажите экран для исправления этих ошибок, чтобы пользователь мог быстро двигаться дальше. Если есть масса ошибок, вы должны просто сделать это и попросить пользователя повторить попытку.
Что касается БД. Либо создайте отдельную таблицу, в которую отправляются загрузки, пока они не будут проверены и не получат ваши «реальные» данные, либо столбец UploadUniqueId, чтобы вы могли без особых хлопот откатить любую загрузку.
удалить tableName, где UploadUniqueId = 'GUID'
Если целостность данных в вашей БД важна, не позволяйте импортировать данные, которые содержат ошибки или не соответствуют требованиям проверки вашей БД.
Поскольку это файлы Excel, пользователю должно быть достаточно легко исправить данные в файле Excel, вместо того, чтобы пытаться использовать другой интерфейс для исправления данных. Просто убедитесь, что сообщения об ошибках указывают пользователю, в какой области возникла проблема, и четко объясняют, в чем проблема.
Вы должны загрузить данные, а затем пометить их, если они не пройдут проверку. Для фактической загрузки данных у вас есть несколько вариантов:
.
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();
}
}
}
Я бы попробовал следующий подход, который хорошо работал в прошлом.
Хотя проверка - это хорошо, убедитесь, что вы храните как можно более сырой формат. В конечном итоге вы совершаете конверсии тысячу раз в тысяче неожиданных мест, и наличие необработанной версии в как можно более неконвертированном состоянии - это большая победа.