SqlBulkCopy ne stocke pas correctement les caractères accentués

datatable sqlbulkcopy sql-server-2008

Question

J'insère du texte en français dans la colonne nvarchar dans SQL Server 2008. Les caractères accentués en français ne sont pas stockés correctement dans la base de données SQL.

string strData = "Accented chars- Les caractères accentués français ";

DataTable dtTemp = new DataTable();
dtTemp.Columns.Add("ID", typeof(string));
dtTemp.Columns.Add("Value", typeof(string));

DataRow dr = dtTemp.NewRow();
dr["ID"] = "100";
dr["Value"] = strData;
dtTemp.Rows.Add(dr);


strSQLCon = GetSQLConnectionString();
using (SqlConnection cn = new SqlConnection(strSQLCon))
{
    cn.Open();
    using (SqlBulkCopy copy = new SqlBulkCopy(cn))
    {
        copy.ColumnMappings.Add("ID", "ID");
        copy.ColumnMappings.Add("Value", "Value");

        copy.DestinationTableName = "MYTABLE";
        copy.WriteToServer(dtTemp);
    }
}

Les caractères français ne sont pas stockés correctement dans la base de données du serveur SQL. Cela fonctionne bien quand je fais une requête d'insertion normale. insérer dans MYTABLEvalues ​​(1, 'Caractères accentués français')

S'il vous plaît laissez-moi savoir pourquoi cela ne fonctionne pas avec la classe de copie SQL Bulk. Tous les paramètres doivent être modifiés ou le code C # doit être modifié pour stocker correctement les caractères non anglais.

Réponse acceptée

Je conçois cette table, le classement de chaque colonne est défini sur French_CI_AS , culture française, accent sensible. Chaque type de chaîne SQL considéré . classement français

Je construis un jeu de données typé pour cette table (pas le but de cette question). jeu de données typé

Sql copie en masse :

  var ds = new FrenchCharacters.FrenchDataSet();
  using (var destinationConnection = new SqlConnection(StackOverflow.Properties.Settings.Default.StackOverflowConnectionString))
      {
        destinationConnection.Open();
        //all French characters http://en.wikipedia.org/wiki/French_orthography
        string[] sArray = new string[] { 
            "Àà, Ââ, Ææ, Ää"
            , "Çç"
            , "Îî, Ïï"
            , "Ôô, Œœ, Öö"
            , "Ùù, Ûû, Üü"
            , "Ÿÿ"
          };
        // open the connection
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
        {
          bulkCopy.BatchSize = 500;
          bulkCopy.NotifyAfter = 10000;
          bulkCopy.DestinationTableName = "French";
          //
          // build data table to be written to the server
          // data table is now strongly-typed ds.French
          //
          for (int i = 0; i < 100; i++)
          {
            foreach (string s in sArray)
              ds.French.AddFrenchRow(s, s, s, s, s, s);                 
          }
          //
          bulkCopy.WriteToServer(ds.French);
        }
      }

résultat: entrez la description de l'image ici

Ne remarquez aucune entrée invalide quel que soit le type de caractère SQL! .


Réponse populaire

J'ai testé votre code sur le tableau suivant et cela a bien fonctionné, du moins sur SQL Server 2012.

CREATE TABLE [dbo].[MYTABLE](
    [ID] [varchar](20) NOT NULL,
    [Value] [nvarchar](255) NOT NULL)


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