首页 > 解决方案 > SSIS 脚本任务 - 使用 C# 将 VARCHAR 转换为 NVARCHAR

问题描述

我正在使用 SQL Server 2014 Enterprise 和 Visual Studio 2103。

我有数百个 TSV 文件,其中包含要导入 SQL Server 的外来字符。我有一个 SSIS 包可以自动执行此操作(只是我在网上找到的使用 C# 的脚本任务)。使用所有列的数据类型创建NVARCHAR(MAX)表,然后脚本逐行读取每个文件,并将值插入表中。

源 TSV 文件导出为 Unicode,但 SQL Server 似乎并不关心 - 它将文件导入为VARCHAR(即,中文字符作为“??????”)。如果您手动将文件导入 SQL Server,代码页会显示“65001 (UTF-8)”,所以我不确定为什么数据类型默认为VARCHAR.

现在,我想我可以为每个文件配置一个 DATA CONVERSION TRANSFORM,但是文件太多,我认为这可以在脚本任务插入中即时完成:

脚本任务:

一些用于编码的变量:

  Encoding ascii = Encoding.ASCII;
  Encoding unicode = Encoding.Unicode;
  Encoding utf8 = Encoding.UTF8;
  Encoding utf32 = Encoding.UTF32;

脚本任务代码的以下部分是我尝试转换编码的地方(IF 语句的第一部分(未显示)创建接收表)。它在指示的地方出错:

else
{
  //ADJUST FOR SINGLE QUOTES:
  line = line.Replace("'", "''");
  byte[] unicodeBYTES = unicode.GetBytes(line);
  byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES);  <--- ERRORS OUT
  char[] unicodeCHARS = new char[unicode.GetCharCount(unicodeCONVERT, 0, unicodeCONVERT.Length)];
  unicode.GetChars(unicodeCONVERT, 0, unicodeCONVERT.Length, unicodeCHARS, 0);
  string NEWline = new string(unicodeCHARS);

  string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
  query += "VALUES('" + NEWline + "')";

  //  MessageBox.Show(query.ToString());

  SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
  myCommand1.ExecuteNonQuery();
}

但是,如果我换行:

byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES);

到以下:

byte[] unicodeCONVERT = Encoding.Convert(unicode, unicode, unicodeBYTES);

它加载数据,但仍为 ASCII 格式(带有“??????”字符)。

任何帮助,将不胜感激。

谢谢你。

标签: c#sqlsql-serverssisscript-task

解决方案


推荐阅读