Не могат да се прочетат данни от excel файл въз основа на колоните в таблицата на SQL Server

Трябва да заредя данни от множество excel файлове в една таблица в sql сървър. Но може да получа различни заглавки в различни файлове. Освен това броят на колоните в Excel ще бъде по-малък в сравнение с таблицата. И така, опитвам се да взема колони от файлове на Excel и да сравня със системна таблица в базата данни, за да получа съответното име на колона. Използвам това в скриптова задача в SSIS пакет. Моля, вижте кода и примерните данни, дадени по-долу. Получаване на грешка при извършване на картографиране на колони.

Name    EmpId   Salary
Anna    PD200   200
Julie   PD300   300

Name    EmpId   Sal
Maria   PD400   400
Treeza  PD500   500


CREATE TABLE [dbo].[testLoad]
(
    [Name] [nvarchar](255) NULL,
    [EmpId] [nvarchar](255) NULL,
    [Salary] [nvarchar](50) NULL
)

public void Main()
        {
            // TODO: Add your code here

            string filepath = Dts.Variables["User::var_File_Path"].Value.ToString();
            string tablename = Dts.Variables["User::var_Tbl_Name"].Value.ToString();
            string filename = Dts.Variables["User::var_File_Name"].Value.ToString();
            string tbl = tablename.Replace("[", "");
            tbl = tbl.Replace("]", "");
            tbl = tbl.Replace("dbo.", "");

            SqlConnection sqlconnection = new SqlConnection();
            sqlconnection = (SqlConnection)(Dts.Connections["ADOAUDIT"].AcquireConnection(Dts.Transaction));

            string ConStr;
            string HDR;
            HDR = "YES";
            ConStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + filepath + "; Extended Properties=\"EXCEL 12.0 XML; HDR="+HDR+"\";";
            OleDbConnection cnn = new OleDbConnection(ConStr);
            cnn.Open();
            DataTable dtSheet = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);


            string sheetname = "";
            string ExcelColumn = "";
            string SqlColumn = "";
            string SqlColumns = "";
            string ExcelCol = "";
            string query = "";
            string querycol = "";

            foreach (DataRow drSheet in dtSheet.Rows)
            {
                sheetname = drSheet["TABLE_NAME"].ToString();
                OleDbCommand oconn = new OleDbCommand(" top 1  * from [" + sheetname + "]", cnn);
                OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
                DataTable dt = new DataTable();
                adp.Fill(dt);
                cnn.Close();

                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    ExcelCol = dt.Columns[i].ColumnName;
                    ExcelCol = ExcelCol.Substring(0, 5);

                    querycol = "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS " +
                        "where TABLE_NAME = '" + tbl + "' " +
                        "and COLUMN_NAME like '" + ExcelCol + "%'";
                    SqlCommand sqlCommand = new SqlCommand(querycol, sqlconnection);
                    SqlColumn = (string)sqlCommand.ExecuteScalar();

                    if (!String.IsNullOrEmpty(SqlColumn))
                    {
                        SqlColumns = SqlColumns + "'" + SqlColumn + "',";
                        ExcelColumn = ExcelColumn + "'" + dt.Columns[i].ColumnName + "',";
                    }
                }

                SqlColumns = SqlColumns.TrimEnd(',');
                ExcelColumn = ExcelColumn.TrimEnd(',');
                query = "select " + ExcelColumn + " from [" + sheetname + "]";

                OleDbConnection conn1 = new OleDbConnection(ConStr);
                conn1.Open();
                OleDbCommand oconn1 = new OleDbCommand(query, conn1);
                OleDbDataAdapter adp1 = new OleDbDataAdapter(oconn1);
                DataTable dt1 = new DataTable();
                adp1.Fill(dt1);
                conn1.Close();

                //Load Data from DataTable to SQL Server Table.
                using (SqlBulkCopy BC = new SqlBulkCopy(sqlconnection))
                {
                    BC.DestinationTableName = tablename;
                    foreach (var column in dt1.Columns)
                    {
                        BC.ColumnMappings.Add(column.ToString(), SqlColumns.ToString());
                    }

                    BC.WriteToServer(dt);
                }
                sqlconnection.Close();
            }

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

        #region ScriptResults declaration
        /// <summary>
        /// This enum provides a convenient shorthand within the scope of this class for setting the
        /// result of the script.
        /// 
        /// This code was generated automatically.
        /// </summary>
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }

Благодаря ти Джули


person Community    schedule 11.02.2018    source източник


Отговори (1)


Уау, това ще бъде мъка за настройка и поддръжка. Ето начин да обедините 2 Excel файла в 1.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;


namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application app = new Excel.Application();

            app.Visible = true;
            app.Workbooks.Add("");
            app.Workbooks.Add(@"C:\Users\Excel\Desktop\excel_files\Book1.xlsx");
            app.Workbooks.Add(@"C:\Users\Excel\Desktop\excel_files\Book2.xlsx");


            for (int i = 2; i <= app.Workbooks.Count; i++)
            {
                int count = app.Workbooks[i].Worksheets.Count;

                app.Workbooks[i].Activate();
                for (int j = 1; j <= count; j++)
                {
                    Excel._Worksheet ws = (Excel._Worksheet)app.Workbooks[i].Worksheets[j];
                    ws.Select(Type.Missing);
                    ws.Cells.Select();

                    Excel.Range sel = (Excel.Range)app.Selection;
                    sel.Copy(Type.Missing);

                    Excel._Worksheet sheet = (Excel._Worksheet)app.Workbooks[1].Worksheets.Add(
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing
                    );

                    sheet.Paste(Type.Missing, Type.Missing);

                }
            }
        }
    }
}

Ако бях на твое място, не бих използвал C# за подобни неща. Мисля, че е по-добре да използвате VBA, за да избутате датата от всеки Excel файл в SQL Server. Ето някои опции, които да разгледате.

https://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm#Introduction

Или използва SQL, за да вземе данните от Excel файловете и да зареди всичко в SQL Server.

SELECT *
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 8.0;HDR=NO;Database=T:\temp\Test.xlsx',
    'select * from [sheet1$]')

Или дори обмислете използването на ресурс на трета страна, за да обедините всички excel файлове в 1 и след това да го заредите в SQL Server. Ето един пример за това, за което говоря.

https://www.rondebruin.nl/win/addins/rdbmerge.htm

въведете описание на изображението тук

person ASH    schedule 22.02.2018