SqlBulkCopy non memorizza correttamente i caratteri accentati

datatable sqlbulkcopy sql-server-2008

Domanda

Sto inserendo il testo in francese nella colonna nvarchar in SQL server 2008. I caratteri accentati francesi non sono memorizzati correttamente nel DB 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);
    }
}

I caratteri francesi non sono memorizzati correttamente nel database di SQL server. Funziona bene quando faccio una normale query di inserimento. inserisci in MYTABLEvalues ​​(1, 'Accented chars- Les caractères accentués français')

Fammi sapere perché non funziona con la classe di copia di SQL Bulk. È necessario modificare le impostazioni o il codice C # deve essere modificato per memorizzare correttamente i caratteri non inglesi.

Risposta accettata

Sto progettando questa tabella, le regole di confronto per ogni colonna sono impostate su French_CI_AS , cultura francese, sensibile all'accento. Ogni tipo di stringa sql considerato . collazione francese

Sto creando un set di dati tipizzato per questa tabella (non lo scopo di questa domanda). set di dati digitati

Copia bulk Sql:

  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);
        }
      }

risultato: inserisci la descrizione dell'immagine qui

Non notare voci non valide indipendentemente dal tipo di carattere sql! .


Risposta popolare

Ho testato il codice nella seguente tabella e ha funzionato correttamente, almeno su SQL Server 2012.

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché