Задача сценария служб SSIS - преобразование VARCHAR в NVARCHAR с использованием C # - PullRequest
0 голосов
/ 23 мая 2018

Я использую 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.

. Теперь, я полагаю, я могу настроитьпреобразование данных для каждого из файлов, но их слишком много, и я думаю, что это можно сделать на лету с помощью вставки задачи сценария:

ЗАДАНИЕ СКРИПТА:

Некоторыепеременные для кодирования:

  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 (с символами «?????»).

Любая помощь будет оценена.

Спасибо.

...