SSIS使用脚本任务 - 将XLS转换为CSV

时间:2013-07-24 19:23:28

标签: c# ssis

我正在使用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();

            }

        }

    }
}

1 个答案:

答案 0 :(得分:0)

我相信你的问题是你将Main声明为静态。

如果我在部分类ScriptMain

的正文中使用了以下内容
    static void Main()
    {
        // Look ma, script entry point is invalid!
    }

生成以下错误

  

SSIS包“Package.dtsx”开始。错误:脚本任务中的0x1:   无法执行脚本,因为脚本入口点无效。任务   失败:脚本任务

入口点是名为Main的方法,它是类的实例。 更熟悉C#的人随意纠正我这个通过添加静态说明符,只有一个Main方法,无论ScriptMain类有多少个实例。

    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;
    }