2016-02-04 35 views
0

我在尝试将ac#脚本任务用作SSIS 2012中的数据流任务的数据源时遇到问题。我有一个更大的查询,运行,但现在我只想证明,这将工作,但到目前为止它不会。下面是代码,并且只返回一个字段,但是一旦它到达last name = reader.getstring()的行,它将抛出一个异常,表示没有可用的行/列数据。我知道一个事实,查询返回10行,不知道发生了什么。我在这个链接下面写了代码:https://msdn.microsoft.com/en-us/library/ms136060.aspxSSIS 2012 C#脚本任务数据源 - 没有行数据

有什么建议吗?

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
using Microsoft.SqlServer.Dts.Runtime.Wrapper; 
using System.Data.OleDb; 


[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 

OleDbDataReader reader; 
OleDbConnection myConnection; 
OleDbCommand myCommand; 

public override void PreExecute() 
{ 
    base.PreExecute(); 


    string sConnectionString = "Provider=MSDAORA.1;User ID = USER;Password=PASS;Data Source=SERVER;persist security info = false"; 
    // string oracleQuery = Variables.OracleSQL; 

    string oracleQuery = "select Name from Name_Table where rownum < 10"; 

    myConnection = new OleDbConnection(sConnectionString); 
    myCommand = new OleDbCommand(oracleQuery, myConnection); 

    myConnection.Open(); 

    reader = myCommand.ExecuteReader(); 

} 

/// <summary> 
/// This method is called after all the rows have passed through this component. 
/// 
/// You can delete this method if you don't need to do anything here. 
/// </summary> 
public override void PostExecute() 
{ 
    base.PostExecute(); 

    reader.Close(); 
    /* 
    * Add your code here 
    */ 
} 

public override void CreateNewOutputRows() 
{ 
    Output0Buffer.AddRow(); 
    Output0Buffer.Name = reader.GetString(0); 

} 

}

+0

您在查询中选择了一个字段(名称),那是为什么? – Alex

回答

0

msdn

的OleDbDataReader的默认位置是在第一 记录之前。因此,您必须调用Read才能开始访问任何数据。

移动到下一行时,您还需要调用Read方法。因此,请在脚本中尝试以下内容:

public override void CreateNewOutputRows() 
{ 
    while (reader.Read()) 
    { 
     Output0Buffer.AddRow(); 
     Output0Buffer.Name = reader.GetString(0); 
    } 
} 

实际上,这是您链接到的页面所采用的方法。