SQLBulkCopy - La méthode WriteToServer ne fonctionne pas

c# datatable sqlbulkcopy

Question

J'essaie d'exporter des données d'un fichier Excel vers une base de données MDF. Pour ce faire, j'utilise Excel Data Reader et 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;
        }
    }
}

Je remplis un fichier de données avec mon fichier Excel et tout va bien. Le programme fonctionne sans problème, mais malheureusement, il n'y a pas d'insertion dans ma table. Une idée pour résoudre ça?

Réponse acceptée

Si vous examinez votre table à l'aide de l'Explorateur de serveur, vous devez vérifier attentivement la connexion utilisée dans cette fenêtre. Il arrive très souvent que votre fichier de base de données soit répertorié dans les fichiers de projet et que la connexion utilisée par l'Explorateur de serveurs pointe vers ce fichier dans le dossier du projet.
Bien entendu, lorsque votre programme est exécuté, la connexion utilisée est celle spécifiée dans votre app.config.
Dans ce scénario, vous n'avez aucune erreur (car aucune erreur n'existe), mais avec l'Explorateur de serveurs, vous recherchez une base de données incorrecte dans laquelle aucune action n'est survenue et vous ne pouvez pas voir les mises à jour.
La solution est simple, vous devez reconfigurer la connexion utilisée par l’explorateur de serveurs pour pointer vers la valeur effective de | DataDirectory | chaîne de substitution (généralement BIN \ DEBUG ou BIN selon le type de projet)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi