SQLBulkCopy - Il metodo WriteToServer non funziona

c# datatable sqlbulkcopy

Domanda

Sto cercando di esportare alcuni dati da un file Excel in un database MDF. Per farlo, sto usando Excel Data Reader e SQL Bulk Copy:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Excel;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;

namespace BulkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fs = File.Open(@"C:\Users\maarab\Desktop\List_Personnel 2013.xlsx", FileMode.Open, FileAccess.Read);
            IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fs);

            DataTable dt = CreateDataTable();

            string cx = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DataTest.mdf;Integrated Security=True;User Instance=True";
            SqlBulkCopy bcp = new SqlBulkCopy(cx, SqlBulkCopyOptions.KeepIdentity);


            bool first = true;

            while (excelReader.Read())
            {
                if (first)
                {
                    first = false;
                }

                else
                {
                    if (String.IsNullOrWhiteSpace(excelReader.GetString(0)))
                        break;

                    else
                    {
                        string numNat = excelReader.GetString(2);
                        DateTime birthDate = excelReader.GetDateTime(9);
                        DateTime startDate = excelReader.GetDateTime(1);

                        if (!String.IsNullOrWhiteSpace(numNat))
                        {
                            if (numNat.Length == 12)
                            {
                                numNat = numNat.Remove(6, 1);
                            }
                        }

                        if (birthDate.Year < 1753)
                            birthDate = DateTime.Now;

                        if (startDate.Year < 1753)
                            startDate = DateTime.Now;

                        dt.Rows.Add(excelReader.GetString(0), excelReader.GetString(0), numNat, startDate, birthDate);

                    }
                }
            }

            bcp.DestinationTableName = "person";
            bcp.BatchSize = 100;

            bcp.ColumnMappings.Add(0, 1);
            bcp.ColumnMappings.Add(1, 2);
            bcp.ColumnMappings.Add(2, 3);
            bcp.ColumnMappings.Add(3, 4);
            bcp.ColumnMappings.Add(4, 5);

            try
            {
                bcp.WriteToServer(dt, DataRowState.Unchanged);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }


            Console.ReadLine();

        }


        public static DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("FirstName", typeof(string));
            dt.Columns.Add("LastName", typeof(string));
            dt.Columns.Add("NumNat", typeof(string));
            dt.Columns.Add("Birthdate", typeof(DateTime));
            dt.Columns.Add("StartDate", typeof(DateTime));

            return dt;
        }
    }
}

Sto riempiendo un datatable con il mio file Excel e tutto va bene. Il programma funziona senza problemi ma sfortunatamente non c'è nessun inserto nel mio tavolo. Qualche idea per risolverlo?

Risposta accettata

Se guardi la tua tabella usando Server Explorer dovresti controllare attentamente la connessione usata in questa finestra. Accade molto spesso che il file del database sia elencato nei file di progetto e che la connessione utilizzata da Esplora server punti a questo file nella cartella del progetto.
Naturalmente, quando viene eseguito il programma, la connessione utilizzata è quella specificata nel tuo app.config.
In questo scenario non si ha alcun errore (perché non esiste alcun errore) ma si guarda con il Server Explorer al database sbagliato dove non si è verificata alcuna azione e non è possibile visualizzare gli aggiornamenti.
La soluzione è semplice, è necessario riconfigurare la connessione utilizzata da Esplora server per puntare al valore effettivo di | DataDirectory | stringa di sostituzione (solitamente BIN \ DEBUG o BIN a seconda del tipo di progetto)



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow