簡體   English   中英

SSIS 使用腳本任務 - 將 XLS 轉換為 CSV

[英]SSIS using Script task - Convert XLS to CSV

我正在使用 C# 腳本任務組件將 XLS 轉換為 CSV 文件,我的入口點設置為 ScriptMain

但我不斷收到錯誤“錯誤:無法執行腳本,因為腳本入口點無效。”

/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.IO;
using System.Data.OleDb;

namespace ST_1feb807359714c80ae0bdd964110df59.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        /*
        The execution engine calls this method when the task executes.
        To access the object model, use the Dts property. Connections, variables, events,
        and logging features are available as members of the Dts property as shown in the following examples.

        To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
        To post a log entry, call Dts.Log("This is my log text", 999, null);
        To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);

        To use the connections collection use something like the following:
        ConnectionManager cm = Dts.Connections.Add("OLEDB");
        cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";

        Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

        To open Help, press F1.
    */


        static void Main(string[] args)
        {

            string sourceFile, worksheetName, targetFile;

            sourceFile = "C:\\NewFolder\\Sample.xls"; worksheetName = "sheet1"; targetFile = "C:\\NewFolder\\target.csv";

            convertExcelToCSV(sourceFile, worksheetName, targetFile);

        }
        static void convertExcelToCSV(string sourceFile, string worksheetName, string targetFile)
        {

            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sourceFile + ";Extended Properties=\" Excel.0;HDR=Yes;IMEX=1\"";

            OleDbConnection conn = null;

            StreamWriter wrtr = null;

            OleDbCommand cmd = null;

            OleDbDataAdapter da = null;

            try
            {

                conn = new OleDbConnection(strConn);

                conn.Open();



                cmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", conn);

                cmd.CommandType = CommandType.Text;

                wrtr = new StreamWriter(targetFile);



                da = new OleDbDataAdapter(cmd);

                DataTable dt = new DataTable();

                da.Fill(dt);



                for (int x = 0; x < dt.Rows.Count; x++)
                {

                    string rowString = "";

                    for (int y = 0; y < dt.Columns.Count; y++)
                    {

                        rowString += "\"" + dt.Rows[x][y].ToString() + "\",";

                    }

                    wrtr.WriteLine(rowString);

                }

                Console.WriteLine();

                Console.WriteLine("Done! Your " + sourceFile + " has been converted into " + targetFile + ".");

                Console.WriteLine();

            }

            catch (Exception exc)
            {

                Console.WriteLine(exc.ToString());

                Console.ReadLine();

            }

            finally
            {

                if (conn.State == ConnectionState.Open)

                    conn.Close();

                conn.Dispose();

                cmd.Dispose();

                da.Dispose();

                wrtr.Close();

                wrtr.Dispose();

            }

        }

    }
}

我相信您的問題是因為您已將 Main 聲明為靜態。

如果我在部分類ScriptMain的主體內使用以下內容

    static void Main()
    {
        // Look ma, script entry point is invalid!
    }

產生以下錯誤

SSIS 包“Package.dtsx”開始。 錯誤:腳本任務中的 0x1:無法執行腳本,因為腳本入口點無效。 任務失敗:腳本任務

入口點是名為 Main 的方法,它是類的一個實例。 更精通 C# 的人隨時糾正我這個問題通過添加靜態說明符,無論 ScriptMain 類有多少個實例,都只有一個 Main 方法。

    public void Main()
    {
        string sourceFile, worksheetName, targetFile;
        sourceFile = "C:\\NewFolder\\Sample.xls"; 
        worksheetName = "sheet1"; 
        targetFile = "C:\\NewFolder\\target.csv";

        convertExcelToCSV(sourceFile, worksheetName, targetFile);
        Dts.TaskResult = (int)ScriptResults.Success;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM