2017-05-03 223 views
2

我嘗試使用SSIS連接到TSQL數據庫以便將數據導出到Excel文件時出現以下錯誤。腳本任務填充:SelectCommand.Connection屬性尚未初始化

System.InvalidOperationException:Fill:SelectCommand.Connection屬性尚未初始化。 at System.Data.Common.DbDataAdapter.GetConnection3(DbDataAdapter adapter,IDbCommand command,String method) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,String srcTable, IDbCommand命令,CommandBehavior行爲) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand command,CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet ) 在ST_e8dfb5f825c943ddab64a2531021cddf.ScriptMain.Main()

下面

是我的代碼:

#region Namespaces 
using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.IO; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
#endregion 

namespace ST_e8dfb5f825c943ddab64a2531021cddf 
{ 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 

     public void Main() 
     { 
      // TODO: Add your code here 
         string datetime=DateTime.Now.ToString("yyyyMMddHHmmss"); 
      try 
      { 
       //Declare Variables 
       string ExcelFileName = Dts.Variables["User::ExcelFileName"].Value.ToString(); 
       string FolderPath = Dts.Variables["User::FolderPath"].Value.ToString(); 
       string TableName = Dts.Variables["User::TableName"].Value.ToString(); 
       string SheetName = Dts.Variables["User::SheetName"].Value.ToString(); 
       ExcelFileName = ExcelFileName + "_" + datetime; 

       OleDbConnection Excel_OLE_Con = new OleDbConnection(); 
       OleDbCommand Excel_OLE_Cmd = new OleDbCommand(); 

       //Construct ConnectionString for Excel 
       string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + FolderPath + ExcelFileName 
        + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\""; 

       //drop Excel file if exists 
       File.Delete(FolderPath + "\\" + ExcelFileName + ".xlsx"); 

       //USE ADO.NET Connection from SSIS Package to get data from table 
       SqlConnection myADONETConnection = new SqlConnection(); 
       myADONETConnection = (SqlConnection)(Dts.Connections["DBConn"].AcquireConnection(Dts.Transaction) as SqlConnection); 

       //Load Data into DataTable from SQL ServerTable 
       // Assumes that connection is a valid SqlConnection object. 
       string queryString = 
        "SELECT * from " + TableName; 
       SqlDataAdapter adapter = new SqlDataAdapter(queryString, myADONETConnection); 
       DataSet ds = new DataSet(); 
       adapter.Fill(ds); 


       //Get Header Columns 
       string TableColumns = ""; 

       // Get the Column List from Data Table so can create Excel Sheet with Header 
       foreach (DataTable table in ds.Tables) 
       { 
        foreach (DataColumn column in table.Columns) 
        { 
         TableColumns += column + "],["; 
        } 
       } 

       // Replace most right comma from Columnlist 
       TableColumns = ("[" + TableColumns.Replace(",", " Text,").TrimEnd(',')); 
       TableColumns = TableColumns.Remove(TableColumns.Length - 2); 
       //MessageBox.Show(TableColumns); 


       //Use OLE DB Connection and Create Excel Sheet 
       Excel_OLE_Con.ConnectionString = connstring; 
       Excel_OLE_Con.Open(); 
       Excel_OLE_Cmd.Connection = Excel_OLE_Con; 
       Excel_OLE_Cmd.CommandText = "Create table " + SheetName + " (" + TableColumns + ")"; 
       Excel_OLE_Cmd.ExecuteNonQuery(); 


       //Write Data to Excel Sheet from DataTable dynamically 
       foreach (DataTable table in ds.Tables) 
       { 
        String sqlCommandInsert = ""; 
        String sqlCommandValue = ""; 
        foreach (DataColumn dataColumn in table.Columns) 
        { 
         sqlCommandValue += dataColumn + "],["; 
        } 

        sqlCommandValue = "[" + sqlCommandValue.TrimEnd(','); 
        sqlCommandValue = sqlCommandValue.Remove(sqlCommandValue.Length - 2); 
        sqlCommandInsert = "INSERT into " + SheetName + "(" + sqlCommandValue.TrimEnd(',') + ") VALUES("; 

        int columnCount = table.Columns.Count; 
        foreach (DataRow row in table.Rows) 
        { 
         string columnvalues = ""; 
         for (int i = 0; i < columnCount; i++) 
         { 
          int index = table.Rows.IndexOf(row); 
          columnvalues += "'" + table.Rows[index].ItemArray[i] + "',"; 

         } 
         columnvalues = columnvalues.TrimEnd(','); 
         var command = sqlCommandInsert + columnvalues + ")"; 
         Excel_OLE_Cmd.CommandText = command; 
         Excel_OLE_Cmd.ExecuteNonQuery(); 
        } 

       } 
       Excel_OLE_Con.Close(); 
       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
      catch (Exception exception) 
      { 

       // Create Log File for Errors 
       using (StreamWriter sw = File.CreateText(Dts.Variables["User::FolderPath"].Value.ToString() + "\\" + 
        Dts.Variables["User::ExcelFileName"].Value.ToString() + datetime + ".log")) 
       { 
        sw.WriteLine(exception.ToString()); 
        Dts.TaskResult = (int)ScriptResults.Failure; 

       } 
      } 
     } 

     enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 


    } 
} 

任何人都可以幫助我瞭解我做錯了什麼。先謝謝你!

上使用Visual Studio ASP.NET 4.0 2010殼牌 SQL服務器2012

+1

如果你正在設置myADONETConnection,你就會過度地關注事物。首先,最初的對象創建不一定會發生。只需設置連接=通話返回。第二,你正在接受一個結果,你將其作爲「Sqlconnection」進行投射,然後第二次投射這個結果......(SqlConnection)(....試着打破這一切,所以首先你從AcquireConnection得到一個變量,看看你是否實際上得到一個連接,然後只做一次單擊。 –

+2

[錯誤:「填充:SelectCommand.Connection屬性尚未初始化。」](http://stackoverflow.com/questions/5750554/error-fill -selectcommand連接 - 屬性 - 有 - 不被初始化) – CodeNotFound

回答

1

嘗試創建的SqlConnection對象時去除= new SqlConnection();,還要檢查連接是否使用它之前打開,你的代碼應該是這樣的:

SqlConnection myADONETConnection = (SqlConnection)(Dts.Connections["DBConn"].AcquireConnection(Dts.Transaction) as SqlConnection); 


    If (myADONETConnection.State != ConnectionState.Open){ 
     myADONETConnection.Open(); 
    } 

    string queryString = 
    "SELECT * from " + TableName; 
    SqlDataAdapter adapter = new SqlDataAdapter(queryString, myADONETConnection); 
    DataSet ds = new DataSet(); 
    adapter.Fill(ds); 
相關問題