IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[SQL Server][C#] case insensitive lors d'un bulk insert?


Sujet :

Accès aux données

  1. #1
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut [SQL Server][C#] case insensitive lors d'un bulk insert?
    Bonjour,

    J'ai fait un petit programme de mise à jour pour les données clientes de mon entreprises.
    Ce programme, insert les données de mise à jour dans une base de publication, pour les appliquer ensuite sur la base de production.

    Le programme marchait jusque là fort bien, mais lors de l'application de la dernière mise à jour générée, incluant une nouvelle table dans la configuration, il y a le message d'erreur suivant:

    Le ColumnMapping fourni ne correspond à aucune colonne de la source ou de la destination.
    Surpris, j'ai regardé en debuggant l'outil, et le mapping était plus que correct.

    J'ai fini par identifier l'erreur en remarquant que dans la configuration de la table dans la mise à jour, il y avait une différence dans le nom du champ dans la base et dans la configuration (un l minuscule dans l'un, un L majuscule dans l'autre).

    Après changement du nom dans la base, la mise à jour passe sans soucis.

    Maintenant, n'étant pas à l'abri d'une nouvelle erreur de ce type, j'aimerais savoir s'il y a un moyen de rendre le bulk insert insensible à la casse.

    Voici le code que j'utilise actuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    public static void fillManuallyDBPub(ConnectionADO conn, Table<IChangeable> t,string dbpub,int idmaj)
            {
                if (conn.Connect() && t.tasks.Count>0)
                {
                    conn.beginTask();
     
                    //nettoyage d'eventuels parasites dans la base de publication
                    new SqlCommand("DELETE FROM " + dbpub + ".dbo." + t.Name+" WHERE maj_id="+idmaj+" or maj_id<"+(idmaj-5), 
                        conn.Connector){CommandTimeout = 600}.ExecuteNonQuery();
     
                    //preparation du bulkinsert
                    var bulker = new SqlBulkCopy(conn.Connector);
                    bulker.BulkCopyTimeout = 1800;
                    bulker.BatchSize = 10000;
                    bulker.DestinationTableName = dbpub + ".dbo." + t.Name;
     
                    //creation du datatable
                    var dt = new DataTable(t.Name);
     
                    for (var i = 0; i < t.all.Count; i++)
                    {
                        dt.Columns.Add(t.all[i].name, GetTypeFromSql(t.all[i].type));
                        bulker.ColumnMappings.Add(t.all[i].name, t.all[i].name);
                    }
                    dt.Columns.Add("maj_type",Type.GetType("System.String"));
                    dt.Columns.Add("maj_id", Type.GetType("System.Int32"));
                    bulker.ColumnMappings.Add("maj_type", "maj_type");
                    bulker.ColumnMappings.Add("maj_id", "maj_id");
     
                    //remplissage du datatable
                    for (var i = 0; i < t.tasks.Count;i++)
                    {
                        var dr = dt.NewRow();
     
                        for(var j=0;j<t.all.Count;j++)
                        {
                            dr[t.all[j].name] = t.tasks[i].toDoList[j];
                        }
                        dr["maj_id"] = idmaj;
                        dr["maj_type"] = t.tasks[i].type == ChangingType.DELETE ? 'D' :
                            t.tasks[i].type == ChangingType.INSERT? 'I' : 'U';
     
                        dt.Rows.Add(dr);
                    }
                    dt.AcceptChanges();
     
                    //go go go
                    bulker.WriteToServer(dt);
     
                    conn.endTask();
                    conn.disConnect();
                }
            }
    J'ai modifié ça pour tester, mais ça ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    //creation du datatable
                    var dt = new DataTable(t.Name){CaseSensitive = false};
    Des idées pour un bulk insert insensible à la casse?

  2. #2
    Invité
    Invité(e)
    Par défaut
    En tuilisant la version T-SQL de bulk insert définit ici.

    Avec cette méthode tu n'as qu'à respecter l'ordre des colonnes et le type des données. Ainsi tu te fatigueras pas à mettre les nom des tables évitant ainsi les fautes de frappe.

  3. #3
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    En tuilisant la version T-SQL de bulk insert définit ici.

    Avec cette méthode tu n'as qu'à respecter l'ordre des colonnes et le type des données. Ainsi tu te fatigueras pas à mettre les nom des tables évitant ainsi les fautes de frappe.

    Oui, je vois ce que tu veux dire, je n'y avais pas pensé, mais le problème reste le même, car l'ordre se trouve aussi dans le fichier de configuration, et je n'ai pas la main à 100% sur ce fichier (sinon j'aurais mis les bons noms dès le début).

    Au passage, je précise que j'ai regardé si ce problème de casse ne venait pas de la structure de la base, mais elle est bien en CI, donc c'est pas ça.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bakonu Voir le message
    ...car l'ordre se trouve aussi dans le fichier de configuration, et je n'ai pas la main à 100% sur ce fichier (sinon j'aurais mis les bons noms dès le début).
    Je ne comprends pas là. Normalement ton fichier respecte un ordre si je ne trompe pas :

    => soit tu modifies l'ordre des colonnes de ta BDD pour respecter le l'ordre défini dans le fichier
    => soit dans ton instruction Bulk insert tu y respecte l'ordre de ton fichier en listant les colonnes de ta base de données dans cet ordre

  5. #5
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    En fait, la seule règle que respecte le fichier, c'est le nom de la table, le nom des champs (sauf la casse), les types/tailles des champs, et s'ils font partie ou non de la primary key.

    Après c'est vrai qu'on peut imposer de la rigueur à l'utilisateur qui saisit le fichier de configuration, cependant je trouve dommage que cette rigueur aille jusqu'à la casse ainsi que l'ordre des champs.

Discussions similaires

  1. [SQL SERVER 2005] CASE avec WHILE
    Par catchouse dans le forum Développement
    Réponses: 1
    Dernier message: 06/05/2009, 11h35
  2. Réponses: 0
    Dernier message: 02/02/2009, 20h05
  3. [sql server]2 colonnes identiques lors du résultat d'une requête.
    Par maxlegrand dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/06/2007, 22h59
  4. [MS SQL SERVER 7.0]Doublons lors d'une requête
    Par massif dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 09/12/2006, 11h35
  5. [SQL SERVER 2000][Trigger] Pb lors de l'execution du trigger
    Par mcousse dans le forum Développement
    Réponses: 4
    Dernier message: 24/11/2006, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo