【问题标题】:Best Practices for uploading files to database将文件上传到数据库的最佳实践
【发布时间】:2010-09-22 05:01:59
【问题描述】:

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

我以前从来没有处理过这种类型的要求,所以任何帮助都会很棒!

谢谢

【问题讨论】:

    标签: .net asp.net database upload


    【解决方案1】:

    我会尝试以下过去效果很好的方法。

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

    【讨论】:

      【解决方案2】:

      您应该上传数据,然后在验证检查失败时对其进行标记。对于实际加载数据,您有几个选择:

      • ADO.Net 批量加载 API - 使用 批量加载 API 以将其置于暂存状态 桌子。下面的 sn-p 显示了 打开 .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 文件。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 虽然验证很好,但请确保尽可能以原始格式存储。您最终会在您意想不到的一千个地方进行一千次转换,并且让原始版本尽可能处于未转换状态是一个巨大的胜利。
        【解决方案4】:

        您想将 excel 文件作为 blob 放入数据库中吗?还是你想解析文件并将文件中的记录放入db中?

        我猜是后者。

        作为用户,我希望可以选择知道错误是什么,以便我可以修复它们并重试。我认为我如何重试取决于我上传的数据量。

        我会尝试做一个混合解决方案..如果只有几个错误显示一个屏幕来纠正这些错误,以便用户可以快速继续。如果有大量错误,您应该可以做到并让用户重新尝试。

        就数据库而言。要么有一个单独的表格供上传,直到它们被检查并获取您的“真实”数据,或者有一个 UploadUniqueId 列,这样您就可以回滚任何上传而不会大惊小怪。

        删除表名,其中 UploadUniqueId = 'GUID'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-10
          • 2012-09-19
          • 1970-01-01
          • 1970-01-01
          • 2012-12-12
          • 1970-01-01
          • 2018-12-24
          • 1970-01-01
          相关资源
          最近更新 更多