【问题标题】:SqlBulkCopy does not store accented characters properlySqlBulkCopy 不能正确存储重音字符
【发布时间】:2014-11-17 14:32:17
【问题描述】:

我在 SQL Server 2008 的 nvarchar 列中插入法语文本。法语重音字符未正确存储在 SQL DB 中。

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

法语字符未正确存储在 SQL Server 数据库中。 当我进行正常的插入查询时它工作正常。插入 MYTABLEvalues(1 , 'Accented chars-Les caractères accentués français')

请告诉我为什么它不适用于 SQL 批量复制类。需要更改任何设置或修改 C# 代码以正确存储非英文字符。

【问题讨论】:

  • 通过中断 dr["Value"] = strData; 进入您的代码;并验证数据是否仍有非英文字符?可能某处的 C# 代码中的编码是错误的。
  • 欢迎来到 StackOverflow!请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”。

标签: sql-server-2008 datatable sqlbulkcopy


【解决方案1】:

我正在设计这张表,每一列的排序规则设置为French_CI_AS,法国文化,重音敏感。 考虑每个 sql 字符串类型

我正在为这个表构建一个类型化数据集(不是这个问题的目的)。

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

结果:

请注意,无论 sql char 类型如何,都没有无效条目!.

【讨论】:

    【解决方案2】:

    我在下表中测试了您的代码,它运行良好,至少在 SQL Server 2012 上是这样。

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

    【讨论】:

      【解决方案3】:

      感谢您的回复。在批量插入之前将 csv 文件读入数据表时似乎会出现此问题。我在读取 csv 文件时包含了编码参数。 (Encoding.Default) 并正确加载法语文本,并将其存储在 SQL DB 中,没有任何问题。

      旧代码: 列出 lstData = File.ReadAllLines(stFile).ToList();

      工作代码: List lstData = File.ReadAllLines(stFile, Encoding.Default).ToList();

      谢谢 阿肖克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2015-05-17
        • 2017-09-04
        • 2017-08-13
        相关资源
        最近更新 更多