La valeur donnée de type String de la source de données ne peut pas être convertie en type int de la colonne cible spécifiée.

c# linq linq-to-xml sqlbulkcopy

Question

J'essaie de lire les valeurs d'un fichier XML, puis d'utiliser la commande en bloc pour insérer les données dans ma base de données.

J'utilise une classe personnalisée qui est:

class Customer
    {
        public int CustomerID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int ShowsNumber { get; set; }
        public int VisitNumber { get; set; }
        public int Cancellation { get; set; }
    }

et j'ai lu les données comme ceci:

List<Customer> customersList =
                (
                    from e in XDocument.Load(file).Root.Elements("cust")
                    select new Customer
                    {
                        CustomerID = (int)e.Attribute("custid"),
                        FirstName = (string)e.Attribute("fname"),
                        LastName = (string)e.Attribute("lname"),
                        ShowsNumber = (int)e.Attribute("count_noshow"),
                        VisitNumber = (int)e.Attribute("count_resos"),
                        Cancellation = (int)e.Attribute("count_cancel"),
                    }).ToList();

Ensuite, j'insère cette liste de customersList dans un fichier de données comme celui-ci:

DataTable dataTable = getBasicDataTable();
for (int i = 0; i < customersList.Count; i++)
                {
                    DataRow datarows = dataTable.NewRow();
                    datarows[0] = customersList[i].CustomerID;
                    datarows[1] = customersList[i].FirstName;
                    datarows[2] = customersList[i].LastName;
                    datarows[3] = customersList[i].ShowsNumber;
                    datarows[4] = customersList[i].VisitNumber;
                    datarows[5] = customersList[i].Cancellation;
                    dataTable.Rows.Add(datarows);
                }

puis j'insère les données dans ma base de données comme ceci:

mais j'ai eu cette exception

using (SqlBulkCopy sbc = new SqlBulkCopy(GetConnectionString()))
            {
                sbc.DestinationTableName = XMLReader.databaseTable;
                sbc.WriteToServer(dataTable);
            }

La valeur donnée de type String de la source de données ne peut pas être convertie en type int de la colonne cible spécifiée.

comme vous le voyez, lorsque j'extrais les données de mon xml, j'utilise déjà les transtypes to int et to string et cela fonctionne. alors pourquoi lors de l'insertion dans la base de données, j'ai eu cette exception?

Remarque

Afin de vous donner le code entier, getBasicDataTable la getBasicDataTable getBasicDataTable

private DataTable getBasicDataTable()
        {
            DataTable dataTable = new DataTable();
            dataTable.Clear();
            dataTable.Columns.Add("customerID");
            dataTable.Columns.Add("firstName");
            dataTable.Columns.Add("lastName");
            dataTable.Columns.Add("showsNumber");
            dataTable.Columns.Add("visitNumber");
            dataTable.Columns.Add("cancellation");
            return dataTable;
        }

Réponse acceptée

Vous devez spécifier la colonne en tant datatable lors de la définition du datatable . Comme ça:-

dataTable.Columns.Add("customerID", typeof(int));

Modifier:
L'autre raison que je soupçonne est probablement la façon dont vous liez votre datatable (je veux dire l'ordre des colonnes) ne correspond pas à celle de la table de base de données. Raison d'être, je pense que le mappage par défaut n'est pas Nom pour Nom mais son Index pour Index dans SqlBulkCopy . Donc, veuillez revérifier l'ordre de votre table de base de données, il devrait ressembler à: -

CustomerID (INT)
FirstName (VARCHAR\NVARCHAR)
LastName (VARCHAR\NVARCHAR)
ShowsNumber (INT)
VisitNumber (INT)
Cancellation (INT)

Réponse populaire

Autant que je sache, vous devez définir le type de la colonne dans le datatable, sinon la chaîne sera présumée (car presque tout peut être converti tel quel).

Avant de définir les valeurs, essayez:

dataTable.Columns[2].Type = typeof (int);

ou bien vous pouvez le spécifier lors de la définition des colonnes:

dataTable.Columns.Add("ShowsNumber", typeof(int));


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