将文件上载到数据库的最佳实践

时间:2008-11-13 17:58:13

标签: .net asp.net database upload

我正在寻找有关如何使用.NET Web应用程序创建与DB的接口以从Excel文件上传数据的最佳实践或想法 我应该使用一种机制来允许加载所有记录并标记错误,还是应该使用一种在发生错误时停止加载的机制。

我从来没有处理过这种类型的要求,所以任何帮助都是超级的!

由于

4 个答案:

答案 0 :(得分:5)

我会尝试以下在过去运作良好的方法。

  1. 允许用户上传文件,将其放在磁盘上。
  2. 将文件的结果绑定到某个网格(您可以使用传统的Connection / Command对象使用ODBC / OLE DB连接到Excel文件)。
  3. 根据一组业务规则将验证应用于网格中的行(excel数据通常很脏)。
  4. 允许用户更新网格中的值并更正验证问题。
  5. 如果所有数据都是犹太教并且用户对此感到满意,则会在交易中执行批量插入。
  6. 如果发生任何“不良”回滚并提供一些用户反馈。

答案 1 :(得分:2)

您应该上传数据,然后在验证检查失败时将其标记。要实际加载数据,您有以下几种选择:

  • ADO.Net批量加载API - 使用 批量加载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文件。

答案 2 :(得分:1)

如果数据库中的数据完整性很重要,请勿允许导入有错误或不符合数据库验证要求的数据。

由于这些是Excel文件,因此用户应该很容易更正Excel文件中的数据,而不是尝试使用其他界面来修复数据。只需确保错误消息将用户指向哪个字段是问题并清楚地解释错误。

答案 3 :(得分:0)

你想把excel文件作为blob放在DB中吗?或者您是否要解析文件并将文件中的记录放入db?

我假设它是后者。

作为用户,我希望能够知道错误是什么,因此我可以修复它们并重试。我想我再试一次取决于我上传的数据量。

我尝试做一个混合解决方案..如果只有少数错误显示屏幕来纠正这些错误,那么用户可以快速前进。如果有大量错误,您应该可以使用并让用户重新尝试。

至于DB。要么有一个单独的表上传,直到它们被检查并获得你的“真实”数据,或者有一个UploadUniqueId列,这样你就可以毫不费力地回滚任何上传。

删除tableName,其中UploadUniqueId ='GUID'