【问题标题】:(SSIS) Script Component "index was outside the bounds of the array"(SSIS)脚本组件“索引超出了数组的范围”
【发布时间】:2016-07-29 03:25:20
【问题描述】:

我正在使用 SSIS (Visual Studio 2015) 脚本组件 (C# 2015) 发出 Web 请求。响应提供指向要下载的 CSV 文件的链接。我使用链接将 CSV 文件流式传输到我写入 OLEDB 目标中的 SQL 数据库的输出。 CSV 文件分为 1000 行。

我为每个数据流运行一次此脚本,每个表一个数据流,总共 12 个数据流。有些工作没有问题,但有些人在加载一些 CSV 后发现此问题。

错误是

   at ScriptMain.CreateNewOutputRows()
   at UserComponent.PrimeOutput(Int32 Outputs, Int32[] OutputIDs, PipelineBuffer[] Buffers, OutputNameMap OutputMap)
   at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PrimeOutput(Int32 outputs, Int32[] outputIDs, PipelineBuffer[] buffers)

脚本代码是

public override void CreateNewOutputRows()
{
    /*
      Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
      For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
    */
    var request = WebRequest.Create(Variables.urlparameter);
    request.ContentType = "application/json; charset=utf-8";
    string responseText;
    string[] fileArray;
    var response = (HttpWebResponse)request.GetResponse();

    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        responseText = sr.ReadToEnd();
        string responseCleaned = responseText.Substring(responseText.IndexOf('[') + 1, responseText.IndexOf(']') - responseText.IndexOf('[') - 1).Replace("\"", "");
        fileArray = responseCleaned.Split(',');
    }

    foreach (string file in fileArray)
    {
        HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(file);
        HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();
        using (Stream fileStream = fileResp.GetResponseStream())
        {
            StreamReader reader = new StreamReader(fileStream, Encoding.UTF8);
            string responseString = reader.ReadToEnd();
            string[] responseRows = responseString.Split(new string[] { "\"\r\n\"", "\"\n\"" }, StringSplitOptions.None);
            foreach (string row in responseRows.Skip(1))
            {
                Output0Buffer.AddRow();
                string[] responseColumns = row.Split(new string[] { "\",\"" }, StringSplitOptions.None);
                Output0Buffer.caseid = responseColumns[0];
                Output0Buffer.assignedfrom = responseColumns[1];
                Output0Buffer.groupname = responseColumns[2];
                Output0Buffer.createdate = responseColumns[3];
                Output0Buffer.createday = responseColumns[4];
                Output0Buffer.audittype = responseColumns[5];
                Output0Buffer.minimpact = responseColumns[6];
                Output0Buffer.casetype = responseColumns[7];
                Output0Buffer.auditid = responseColumns[8];
                Output0Buffer.impact = responseColumns[9];
                Output0Buffer.cti = responseColumns[10];
                Output0Buffer.createhour = responseColumns[11];
                Output0Buffer.assignedtoindividual = responseColumns[12];
                Output0Buffer.closurecode = responseColumns[13];
                Output0Buffer.contacttime = responseColumns[14];
                Output0Buffer.impact12time = responseColumns[15];
                Output0Buffer.region = responseColumns[16];
                Output0Buffer.requesterlogin = responseColumns[17];
                Output0Buffer.resolution = responseColumns[18];
                Output0Buffer.resolvedby = responseColumns[19];
                Output0Buffer.resolveddate = responseColumns[20];
                Output0Buffer.rootcause = responseColumns[21];
                Output0Buffer.rootcausedetails = responseColumns[22];
                Output0Buffer.prioritylabel = responseColumns[23];
                Output0Buffer.ecd = responseColumns[24];
                Output0Buffer.dedupekey = responseColumns[25];
                Output0Buffer.groupmanagerlogin = responseColumns[26];
                Output0Buffer.assigneemanagerlogin = responseColumns[27];
                Output0Buffer.site = responseColumns[28];
                Output0Buffer.status = responseColumns[29];
                Output0Buffer.timespent = responseColumns[30];
                Output0Buffer.initialescalationtime = responseColumns[31];
                Output0Buffer.lastmodifieddate = responseColumns[32];
                Output0Buffer.totaltimespent = responseColumns[33];
                Output0Buffer.referenceinfo = responseColumns[34];
                Output0Buffer.shortdescriotion = responseColumns[35];
                Output0Buffer.cticategory = responseColumns[36];
                Output0Buffer.ctitype = responseColumns[37];
                Output0Buffer.ctiitem = responseColumns[38];
            }
        }
        fileReq = null;
        fileResp = null;
    }
}

如果有用的话,我收到并用于调用网络请求的 JSON 响应是:

{"files":["https://sample.url.com/raw/fetch/451cf3ecc1/raw-0.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-1.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-2.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-3.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-4.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-5.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-6.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-7.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-8.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-9.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-10.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-11.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-12.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-13.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-14.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-15.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-16.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-17.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-18.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-19.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-20.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-21.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-22.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-23.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-24.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-25.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-26.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-27.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-28.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-29.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-30.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-31.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-32.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-33.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-34.csv","https://sample.url.com/raw/fetch/451cf3ecc1/raw-35.csv"],"info":["Defaulted to 'UTC' timezone"],"warn":["Truncated 'to' - dropped hours, minutes and seconds. Was 1469121708000, Used 1469059200000"]}

【问题讨论】:

  • 在脚本中放置一个断点,并在调试器中单步调试代码以获取有关问题所在的更多信息。
  • 我试过了。添加输出列时插入几百行后会生成错误。我无法从中找到任何有用的东西。据我所知,当您尝试创建一个不存在的输出时会发生这种情况,所以奇怪的是它在多次使用输出后会这样做。附带说明一下,手表在 SSIS 脚本组件中不起作用。当我将它作为自己的 VS 包运行时,它运行良好,但也不会生成输出。
  • 好的,那么错误发生在哪一行代码上?发生错误时的索引值是多少,当时数组的范围是多少?
  • 我无法添加手表,但是我添加了一个 try catch 并在调用 catch 时重新路由整个行。它导出了 2 行,这表明问题是我正在处理的行没有被我设置的参数正确拆分。处理更新的拆分,但似乎对于这些选择的行,我错过了一些东西,导致列数少于配置。

标签: ssis


【解决方案1】:

原来问题在于 CSV 行分隔符是 \"\r\n\" 并且其中一列的值为 \"\r\n\"。我将其更新为 [!,]\"\r\n\" 解决了该问题。

索引错误是由于拆分没有像我预期的那样填充数组。感谢您查看,很抱歉发布了一个实际上只是我的错误的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2015-11-06
    • 2010-11-17
    相关资源
    最近更新 更多