如何将C#多维列表放入SSIS对象变量中?
我每周多次收到来自外部供应商的CSV文件,其中包含不同数量的空白单元格、文本限定符,并且经常缺少行分隔符,从而导致我现有的平面文件连接在SSIS包中失败。收到更正的文件需要一天以上的时间,从业务角度来看,这会导致重大问题 我一直在开发一个C#脚本任务,将CSV文件导入多维列表,并成功地将列表内容输出到消息框中。但是,当我试图将列表中的值传递给我的对象变量时,我收到一个错误,说明“在集合中找不到元素” 为了将列表数据传递到对象变量中,我需要做哪些不同的操作?以下是我的现有代码,并附有注释:如何将C#多维列表放入SSIS对象变量中?,c#,multidimensional-array,ssis,C#,Multidimensional Array,Ssis,我每周多次收到来自外部供应商的CSV文件,其中包含不同数量的空白单元格、文本限定符,并且经常缺少行分隔符,从而导致我现有的平面文件连接在SSIS包中失败。收到更正的文件需要一天以上的时间,从业务角度来看,这会导致重大问题 我一直在开发一个C#脚本任务,将CSV文件导入多维列表,并成功地将列表内容输出到消息框中。但是,当我试图将列表中的值传递给我的对象变量时,我收到一个错误,说明“在集合中找不到元素” 为了将列表数据传递到对象变量中,我需要做哪些不同的操作?以下是我的现有代码,并附有注释: usi
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
try
{
//string dataRow;
FileStream fileName = new FileStream(Dts.Variables["ImportFilename"].Value.ToString(), FileMode.Open, FileAccess.Read);
var column1 = new List<string>();
var column2 = new List<string>();
var column3 = new List<string>();
var column4 = new List<string>();
var column5 = new List<string>();
var column6 = new List<string>();
var column7 = new List<string>();
var column8 = new List<string>();
var column9 = new List<string>();
var column10 = new List<string>();
using (StreamReader rd = new StreamReader(fileName))
{
while (!rd.EndOfStream)
{
var splits = rd.ReadLine().Split(',');
column1.Add(splits[0]);
column2.Add(splits[1]);
column3.Add(splits[2]);
column4.Add(splits[3]);
column5.Add(splits[4]);
column6.Add(splits[5]);
column7.Add(splits[6]);
column8.Add(splits[7]);
column9.Add(splits[8]);
column10.Add(splits[9]);
}
}
var mergedColumns = new List<String>(column1.Count +
column2.Count +
column3.Count +
column4.Count +
column5.Count +
column6.Count +
column7.Count +
column8.Count +
column9.Count +
column10.Count);
mergedColumns.AddRange(column1);
mergedColumns.AddRange(column2);
mergedColumns.AddRange(column3);
mergedColumns.AddRange(column4);
mergedColumns.AddRange(column5);
mergedColumns.AddRange(column6);
mergedColumns.AddRange(column7);
mergedColumns.AddRange(column8);
mergedColumns.AddRange(column9);
mergedColumns.AddRange(column10);
//THIS IS RETURNING ALL THE VALUES FROM ALL COLUMNS
string msg = string.Empty;
foreach (string x in mergedColumns)
{
msg += x.ToString() + "\r\n";
}
MessageBox.Show(msg.ToString());
//RETURNS "The element cannot be found in a collection" ERROR.
Dts.Variables["importFile"].Value = mergedColumns;
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception ex)
{
Dts.Events.FireError(-1, "ErrorMessage", ex.ToString(), "", 0);
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.IO;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
公共图书馆
{
尝试
{
//字符串数据行;
FileStream fileName=新文件流(Dts.Variables[“ImportFilename”].Value.ToString(),FileMode.Open,FileAccess.Read);
var column1=新列表();
var column2=新列表();
var column3=新列表();
var column4=新列表();
var column5=新列表();
var column6=新列表();
var column7=新列表();
var column8=新列表();
var column9=新列表();
var column10=新列表();
使用(StreamReader rd=新的StreamReader(文件名))
{
而(!rd.EndOfStream)
{
var splits=rd.ReadLine().Split(',');
第1列。添加(拆分[0]);
第2栏添加(拆分[1]);
第3栏添加(拆分[2]);
第4栏添加(拆分[3]);
第5栏添加(拆分[4]);
第6栏添加(拆分[5]);
第7栏添加(拆分[6]);
第8栏添加(拆分[7]);
第9栏添加(拆分[8]);
第10栏添加(拆分[9]);
}
}
var mergedColumns=新列表(column1.Count+
第2栏.计数+
第3栏.计数+
第4栏.计数+
第5栏.计数+
第6栏.计数+
第7栏.计数+
第8栏.计数+
第9栏.计数+
第10栏(计数);
mergedColumns.AddRange(第1列);
mergedColumns.AddRange(第2列);
mergedColumns.AddRange(第3列);
mergedColumns.AddRange(第4列);
mergedColumns.AddRange(第5列);
mergedColumns.AddRange(第6列);
mergedColumns.AddRange(第7列);
mergedColumns.AddRange(第8列);
mergedColumns.AddRange(第9列);
mergedColumns.AddRange(第10列);
//这将返回所有列中的所有值
string msg=string.Empty;
foreach(合并列中的字符串x)
{
msg+=x.ToString()+“\r\n”;
}
Show(msg.ToString());
//返回“集合中找不到元素”错误。
Dts.Variables[“importFile”].Value=mergedColumns;
Dts.TaskResult=(int)ScriptResults.Success;
}
捕获(例外情况除外)
{
Dts.Events.FireError(-1,“ErrorMessage”,例如ToString(),“”,0);
Dts.TaskResult=(int)ScriptResults.Failure;
}
}
更新2016-07-07:
根据我的建议,我对代码进行了以下更新。我想我很接近了,但我无法找出两个问题:
1.)我的td.Columns.Add行中的每一行都会生成错误“Identifier expected”,但我不知道需要做什么来更正它
2.)内部foreach循环声明“……不包含‘键’的定义,并且找不到接受第一个参数类型的扩展方法‘键’。”我不认为我缺少引用,但我不确定是什么错
这是我目前的代码,有什么建议吗
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
//THIS WORKS
public class Schip
{
public string UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string ResidentState { get; set; }
public string ResidentStateAbbreviation { get; set; }
public string NonResidentState { get; set; }
public string NonResidentStateAbbreviation { get; set; }
public string IssueDate { get; set; }
public string ExpirationDate { get; set; }
public string InternalUserID { get; set; }
}
public void Main()
{
try
{
//THIS WORKS
FileStream fileName = new FileStream(Dts.Variables["ImportFilename"].Value.ToString(), FileMode.Open, FileAccess.Read);
List<Schip> adjImport = new List<Schip>();
StreamReader rd1 = new StreamReader(fileName);
while (!rd1.EndOfStream)
{
var split = rd1.ReadLine().Split(',');
adjImport.Add(new Schip
{
UserId = split[0],
FirstName = split[1],
LastName = split[2],
ResidentState = split[3],
ResidentStateAbbreviation = split[4],
NonResidentState = split[5],
NonResidentStateAbbreviation = split[6],
IssueDate = split[7],
ExpirationDate = split[8],
InternalUserID = split[9]
});
}
rd1.Dispose();
//THIS WORKS
DataTable td = new DataTable("td");
td.Clear();
td.Columns.Add("UserId");
td.Columns.Add("FirstName");
td.Columns.Add("LastName");
td.Columns.Add("ResidentState");
td.Columns.Add("ResidentStateAbbreviation");
td.Columns.Add("NonResidentState");
td.Columns.Add("NonResidentStateAbbreviation");
td.Columns.Add("IssueDate");
td.Columns.Add("ExpirationDate");
td.Columns.Add("InternalUserID");
//THIS GENERATES "Identifier expected" ERRORS ON EACH ROW
//AND NO DEFINITION FOR "Keys".
foreach (Schip schip in adjImport)
{
DataRow newRow = td.NewRow();
foreach(string column in schip.Keys)
{
newRow["AdjusterId"] = schip.["AdjusterId"];
newRow["FirstName"] = schip.["FirstName"];
newRow["LastName"] = schip.["LastName"];
newRow["ResidentState"] = schip.["ResidentState"];
newRow["ResidentStateAbbreviation"] = schip.["ResidentStateAbbreviation"];
newRow["NonResidentState"] = schip.["NonResidentState"];
newRow["NonResidentStateAbbreviation"] = schip.["NonResidentStateAbbreviation"];
newRow["IssueDate"] = schip.["IssueDate"];
newRow["ExpirationDate"] = schip.["ExpirationDate"];
newRow["CCMSIAdjusterID"] = schip.["CCMSIAdjusterID"];
}
td.Rows.Add(newRow);
td.AcceptChanges();
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception ex)
{
Dts.Events.FireError(-1, "ErrorMessage", ex.ToString(), "", 0);
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
public分部类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
//这很有效
公营学校
{
公共字符串用户标识{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串剩余状态{get;set;}
公共字符串ResidentState缩写{get;set;}
公共字符串非居民状态{get;set;}
公共字符串非居民状态缩写{get;set;}
公共字符串IssueDate{get;set;}
公共字符串过期日期{get;set;}
公共字符串InternalUserID{get;set;}
}
公共图书馆
{
尝试
{
//这很有效
FileStream fileName=新文件流(Dts.Variables[“ImportFilename”].Value.ToString(),文件