Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 脚本任务无法处理工作表名称中的空格_C#_Ssis_Script Task - Fatal编程技术网

C# 脚本任务无法处理工作表名称中的空格

C# 脚本任务无法处理工作表名称中的空格,c#,ssis,script-task,C#,Ssis,Script Task,嗨,我有一个脚本任务,从文件夹中提取excel文件。这些文件有几张纸,上面写着“问题1”、“问题2”……等等 我的问题是,它没有阅读或访问上述表格,在问题和1之间有“空格” 但当我将其替换为(_)时,即问题1、问题2…将被检索到..我的脚本任务代码如下..有任何建议我应该在代码中更改什么以选择sheetname作为原始名称 using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Wi

嗨,我有一个脚本任务,从文件夹中提取excel文件。这些文件有几张纸,上面写着“问题1”、“问题2”……等等

我的问题是,它没有阅读或访问上述表格,在问题和1之间有“空格”

但当我将其替换为(_)时,即问题1、问题2…将被检索到..我的脚本任务代码如下..有任何建议我应该在代码中更改什么以选择sheetname作为原始名称

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Linq;
using System.Data.OleDb;
using System.Data.SqlClient;
//using System.Text.RegularExpressions;

namespace ST_0762ccf78a5c4709b806530e3c885949
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        // public static string RemoveSpecialCharacters(string str) { return str.Replace("[^A-Za-z0-9_\\\\.]")};

        public void Main()
        {
            String FolderPath = Dts.Variables["User::FolderPath"].Value.ToString();

            string StartingColumn = Dts.Variables["User::StartingColumn"].Value.ToString();
            string EndingColumn = Dts.Variables["User::EndingColumn"].Value.ToString();
            string StartReadingFromRow = Dts.Variables["User::StartReadingFromRow"].Value.ToString();

            var directory = new DirectoryInfo(FolderPath);
            FileInfo[] files = directory.GetFiles();

            //Declare and initilize variables
            string fileFullPath = "";
            //Get one Book(Excel file at a time)
            foreach (FileInfo file in files)
            {
                string filename = "";
                fileFullPath = FolderPath + "\\" + file.Name;
                //filename = file.Name.Replace(".xlsx", "");
                filename = file.Name.Replace("'", " ");
                MessageBox.Show(fileFullPath);

                //Create Excel Connection
                string ConStr;
                string HDR;
                HDR = "YES";
                ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=1\"";
                OleDbConnection cnn = new OleDbConnection(ConStr);

                //Get the sheetname and filename as columns
                /* SqlConnection myADONETConnection = new SqlConnection();
                 myADONETConnection = (SqlConnection)(Dts.Connections["Pulse_All_Tables"].AcquireConnection(Dts.Transaction) as SqlConnection);
                 string SQLColumnList = "";
                 string SQLQueryToGetMatchingColumn = "";
                 SqlCommand cmd = myADONETConnection.CreateCommand();
                 cmd.CommandText = SQLQueryToGetMatchingColumn;
                 SQLColumnList = (string)cmd.ExecuteScalar();*/


                //Get Sheet Name

                cnn.Open();
                DataTable dtSheet = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string sheetname;
                sheetname = "";
                //sheetname = sheetname.Replace(" ", string.Empty);
                //string sheetname1 = "";

                foreach (DataRow drSheet in dtSheet.Rows)
                {
                    //if (drSheet["TABLE_NAME"].ToString().Contains("$"))
                    if (!drSheet["Table_Name"].ToString().Contains("FilterDatabase") && !drSheet["Table_Name"].ToString().EndsWith("$'"))
                    {
                        sheetname = drSheet["TABLE_NAME"].ToString();
                        //Display Sheet Name , you can comment it out
                        MessageBox.Show(sheetname);


                        //Load the DataTable with Sheet Data
                        //Get the sheetname and filename as columns

                        //OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + StartingColumn + StartReadingFromRow + ":" + EndingColumn + "]", cnn);
                        OleDbCommand oconn = new OleDbCommand("select " + "*" + ",'" + filename + "' AS FileName" + ",'" + sheetname + "' AS SheetName from [" + sheetname + StartingColumn + StartReadingFromRow + ":" + EndingColumn + "]", cnn);
                        //cnn.Open();
                        OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
                        DataTable dt = new DataTable();
                        adp.Fill(dt);

                        //drop $from sheet name
                        sheetname = sheetname.Replace("$", "");

                        //sheetname = sheetname.Replace((sheetname.Replace("$", "")),"_");


                        //sheetname1 = sheetname.Replace(" ", "");

                        // Generate Create Table Script by using Header Column,It will drop the table if Exists and Recreate                  
                        string tableDDL = "";
                        tableDDL += "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = ";
                        tableDDL += "OBJECT_ID(N'[dbo].[" + filename + "_" + sheetname + "]') AND type in (N'U'))";
                        tableDDL += "Drop Table [dbo].[" + filename + "_" + sheetname + "]";
                        tableDDL += "Create table [" + filename + "_" + sheetname + "]";
                        tableDDL += "(";
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            if (i != dt.Columns.Count - 1)
                                tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)" + ",";
                            else
                                tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)";
                        }
                        tableDDL += ")";


                        //use ADO.NET connection to Create Table from above Definition
                        SqlConnection myADONETConnection = new SqlConnection();
                        myADONETConnection = (SqlConnection)(Dts.Connections["Pulse_All_Tables"].AcquireConnection(Dts.Transaction) as SqlConnection);
                        //you can comment the messagebox, it is for debugging
                        MessageBox.Show(tableDDL.ToString());
                        SqlCommand myCommand = new SqlCommand(tableDDL, myADONETConnection);
                        myCommand.ExecuteNonQuery();
                        //Comment this message, it is for debugging
                        MessageBox.Show("TABLE IS CREATED");


                        //Load the data from DataTable to SQL Server Table.
                        SqlBulkCopy blk = new SqlBulkCopy(myADONETConnection);
                        blk.DestinationTableName = "[" + filename + "_" + sheetname + "]";
                        blk.WriteToServer(dt);
                    }
                }
            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }

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

    }
}
使用系统;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
使用System.IO;
使用System.Linq;
使用System.Data.OleDb;
使用System.Data.SqlClient;
//使用System.Text.RegularExpressions;
名称空间ST_0762ccf78a5c4709b806530e3c885949
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
//公共静态字符串删除特殊字符(字符串str){return str.Replace(“[^A-Za-z0-9\\\\\.]”);
公共图书馆
{
字符串FolderPath=Dts.Variables[“User::FolderPath”].Value.ToString();
字符串StartingColumn=Dts.Variables[“User::StartingColumn”].Value.ToString();
字符串EndingColumn=Dts.Variables[“User::EndingColumn”].Value.ToString();
字符串StartReadingFromRow=Dts.Variables[“User::StartReadingFromRow”].Value.ToString();
var directory=newdirectoryinfo(FolderPath);
FileInfo[]files=目录.GetFiles();
//声明并初始化变量
字符串fileFullPath=“”;
//获取一本书(一次获取Excel文件)
foreach(文件中的文件信息文件)
{
字符串filename=“”;
fileFullPath=FolderPath+“\\”+file.Name;
//filename=file.Name.Replace(“.xlsx”,”);
filename=file.Name.Replace(“,”);
MessageBox.Show(fileFullPath);
//创建Excel连接
字符串构造;
字符串HDR;
HDR=“是”;
ConStr=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+fileFullPath+”;扩展属性=\”Excel 12.0;HDR=“+HDR+”;IMEX=1\”;
OLEDB连接cnn=新的OLEDB连接(ConStr);
//将sheetname和filename作为列获取
/*SqlConnection myADONETConnection=newsqlconnection();
myADONETConnection=(SqlConnection)(Dts.Connections[“Pulse\u All\u Tables”].AcquireConnection(Dts.Transaction)作为SqlConnection);
字符串SQLColumnList=“”;
字符串SQLQueryToGetMatchingColumn=“”;
SqlCommand cmd=myADONETConnection.CreateCommand();
cmd.CommandText=SQLQueryToGetMatchingColumn;
SQLColumnList=(字符串)cmd.ExecuteScalar()*/
//获取工作表名称
cnn.Open();
DataTable dtSheet=cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
字符串名称;
sheetname=“”;
//sheetname=sheetname.Replace(“,string.Empty);
//字符串sheetname1=“”;
foreach(dtSheet.Rows中的数据行drSheet)
{
//if(drSheet[“TABLE_NAME”].ToString()包含(“$”)
如果(!drSheet[“Table_Name”].ToString()包含(“FilterDatabase”)&&!drSheet[“Table_Name”].ToString().EndsWith($”)
{
sheetname=drSheet[“表名称”]。ToString();
//显示图纸名称,您可以将其注释掉
MessageBox.Show(sheetname);
//用图纸数据加载DataTable
//将sheetname和filename作为列获取

//OleDbCommand oconn=新的OleDbCommand(“从[”+sheetname+StartingColumn+StartReadingFromRow+”:“+EndingColumn+”],cnn中选择*);
OleDbCommand oconn=新的OleDbCommand(“选择“+”*“+”,“+filename+”'作为文件名“+”,“+sheetname+”,作为来自[“+sheetname+StartingColumn+startredingfromrow+”:“+EndingColumn+”],cnn)的sheetname); //cnn.Open(); OleDbDataAdapter adp=新的OleDbDataAdapter(oconn); DataTable dt=新的DataTable(); 自动进料(dt); //从工作表名称中删除$ sheetname=sheetname。替换(“$”,“”); //sheetname=sheetname.Replace((sheetname.Replace(“$”,”),“”); //sheetname1=sheetname.Replace(“,”); //使用Header列生成createtable脚本,如果存在,它将删除该表并重新创建 字符串tableDDL=“”; tableDDL+=“如果存在(从sys.objects中选择*,其中object_id=”; tableDDL+=“对象ID(N'[dbo].“+filename+”[U'+sheetname+“]),并键入(N'U')”; tableDDL+=“Drop Table[dbo]。”+filename+““+sheetname+”]; tableDDL+=“创建表[”+文件名+““+图纸名+”]; tableDDL+=“(”; 对于(int i=0;ioconn = new OleDbCommand("SELECT * FROM " + ("[" + dr["TABLE_NAME"].ToString() + "B1:B1]").Replace("'", ""), cnn);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Data;
using Microsoft.Win32;

namespace ConsoleApp13
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "c:\\temp\\test.xlsx";

            string ConStr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=NO;Empty Text Mode=NullAsEmpty""", fileName);
            OleDbConnection cnn = new OleDbConnection(ConStr);
            cnn.Open();

            DataTable dt = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["TABLE_NAME"]);
                
                //currently hardcoded B1:B1 - has to be replaced with your StartColumn:EndColumn logic
                string cmd = "SELECT * FROM " + ("[" + dr["TABLE_NAME"].ToString() + "B1:B1]").Replace("'", "");
                Console.WriteLine("\t"+cmd);


                DataTable dt2 = new DataTable();
                DataSet ds = new DataSet();
                OleDbDataAdapter da = new OleDbDataAdapter(cmd, cnn);

                da.Fill(ds);
                dt2 = ds.Tables[0];

                foreach(DataRow dr2 in dt2.Rows)
                {
                    Console.WriteLine("\t" + dr2[0].ToString());
                }
            }

            cnn.Close();

            Console.WriteLine("Ende...");
            Console.ReadKey();
        }
    }
}