SSIS脚本任务 - 使用C#将VARCHAR转换为NVARCHAR

时间:2018-05-23 01:05:43

标签: c# sql sql-server ssis script-task

我使用的是SQL Server 2014 Enterprise和Visual Studio 2103。

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

源TSV文件以Unicode格式导出,但SQL Server似乎并不关心 - 它将文件导入为VARCHAR(即汉字过来为" ???? ?&#34)。如果手动将文件导入SQL Server,代码页将显示" 65001(UTF-8)"所以我不确定为什么数据类型默认为VARCHAR

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

SCRIPT TASK:

编码的一些变量:

  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格式(使用&#34; ?????&#34;字符)。

任何帮助都将不胜感激。

谢谢。

0 个答案:

没有答案