【问题标题】:Can you integrate SSIS project with website?您可以将 SSIS 项目与网站集成吗?
【发布时间】:2020-05-29 18:37:30
【问题描述】:

根据我的项目需求,我需要在公司网站上开发几个页面,用户可以上传一个excel表格来将数据传输到MS SQL Server。我开始使用 SSIS,但我想知道如何制作网页的这一部分。

【问题讨论】:

标签: .net sql-server ssis sql-server-data-tools


【解决方案1】:

您不能在 Web 应用程序中使用 SSIS 包。在您的应用程序中处理 Excel 文件也可能很复杂,因此,解决此问题的一种常见方法是:

  1. 将上传的文档存储在特定文件夹中。
  2. 使用诸如 (F2020_05_29_10:330:24_3283) 之类的时间戳或任何其他使文件独一无二的方法来命名文件
  3. 将您的 SSIS 包部署到 SQL Server 并安排一个作业来运行该包
  4. 在您的包中查看该特定文件夹以查看是否有任何新的传入文件。
  5. 如果有一个或多个文件,请在您的 SSIS 包中处理它们

另一种方法是使用 COM Interop 或 OpenXML 处理您的 Excel 文件,这可能会很复杂。

【讨论】:

  • 无需安排作业。用户上传文件后,只需像任何其他数据库查询一样调用作业EXECUTE msdb.dbo.sp_start_job 'ExcelWebProcessor'
  • 好方法。我要提醒的另一点是 Excel COM 互操作方法需要 Web 服务器上的 Office 许可证 - 请咨询您的许可授权经销商以确认
  • 对。这是复杂性的一部分。通常,出于安全考虑,公司不允许在服务器上安装 Office。
【解决方案2】:

您可以在 sql 作业中安排 SSIS 每隔几分钟左右运行一次。使用 for each 循环,这样如果没有文件,它实际上不会做任何事情。

【讨论】:

  • 正如我所说,我希望它成为网站的一部分。我不想安排任何事情。
【解决方案3】:

是的,你可以,但你可能不想这样做。

Excel 和 SSIS 充其量只是挑剔的伙伴。 SSIS 相信一组固定的元数据在设计时建立并在运行时遵守。 Excel 根据对前 8 行数据的采样解释元数据。如果 Excel 文件是机器生成的,那么 SSIS 和它可以很好地协同工作,但由于这将是用户上传文件......您将花费大量时间来解决为什么两个看似相同的电子表格无法解析相同的问题在 SSIS 中的方式。

如何让 SSIS 运行?要么使用对象模型,要么使用 dtexec.exe 来完成它。仅当您已为 SQL Server 授权服务器时,这两种方法才有效。如果您在 Web 服务器上安装对象库或集成服务服务,则需要为您的企业购买另一个 SQL Server 许可证。太贵了。

我(可能是 Stack Overflow 上最喜欢 SSIS 的人)会做什么?我会使用 OpenXml 库,比如 EPPlus。我在Reading Excel files without Excel

中写了一篇关于方法的博客
using OfficeOpenXml;
// ...
/// Get data from Excel worksheet, assuming columns A-G are desired
public Dictionary<string, List<string>> GetExcelDriverData(string sourceFile)
{
    Dictionary<string, List<string>> d = new Dictionary<string, List<string>>();
    System.IO.FileInfo fi = new System.IO.FileInfo(sourceFile);
    using (ExcelPackage ep = new ExcelPackage(fi))
    {
        ExcelWorkbook wb = ep.Workbook;
        ExcelWorksheet ws = wb.Worksheets.First();
        if (ws != null)
        {
            // 1 based array to 7, inclusive
            for (int i = ws.Dimension.Start.Row+1; i < ws.Dimension.End.Row+1; i++)
            {
                List<string> row = new List<string>() { ws.Cells[i, 1].Value.ToString()
                ,   ws.Cells[i, 2].Value.ToString()
                ,   ws.Cells[i, 3].Value.ToString()
                ,   ws.Cells[i, 4].Value.ToString()
                ,   ws.Cells[i, 5].Value.ToString()
                ,   ws.Cells[i, 6].Value.ToString()
                ,   ws.Cells[i, 7].Value.ToString()
                };

                d[ws.Cells[i, 7].Value.ToString()] = row;
            }
        }
    }

    return d;
}

请注意,如果您正在处理事情,这是last LGPL version of EPPlus。版本 5+ 需要许可,但它比 SQL Server 许可便宜得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多