Eek Ten Bears Ответов: 1

Когда на самом деле обновляется таблица данных в памяти?


Извините, что это немного сложно объяснить, но на самом деле это очень простой вопрос....просто укажи мне на нужный сайт.

I am using SSIS to write a set of n data files from a database. Simplifying a hell of lot I divide very big SQL data sets comprising different related objects into smaller chunks and write them to text files. So for example I might have 17 customer files, 17 aligned customer address files and so on. At a set point in the process I ask SSIS to work through a ForEach loop which configures the SQL for that file and then writes the file. This is all complicated by other requirements but it works well. So today I ask for customers, tomorrow I ask for vendors, on Monday its materials, Tuesday Service History etc etc. Brilliant application if I say so myself, one problem...

Бит "запись файла" с использованием C# имеет проблему с Unicode. Когда я нажимаю на него громкостью, он с трудом определяет, нужно ли сохранять файл в юникоде или нет.

So for example the first 1 of 17 files for customers all have names which are in the standard base character set (they do its old UK and NW European customers) but when it gets to file 5 it find lots of our far eastern customers. The C# code seems to be stuck not in Unicode and translates the characters as ????s. Since there are lots of customers in one place like this it stands out, but checking back I've had errors previously just not in file 1. Moreover if I adjust the order of my extract to start with the far-eastern customers its fine again. I'm a SQL coder with lots of C# experience but I am missing something fundamentally important here. A short simple explanation now will prevent future disaster - thank-you guys...

Мой код ниже, я думаю, что происходит, когда я использую
DataTable dtD = new DataTable();
на самом деле он не дает мне новую базу данных, а просто очищает старую. Поэтому, если он решил не быть Unicode в первом наборе данных, он продолжает оставаться таким же. Помните, что сценарий вызывается через SSIS, который управляет следующей итерацией.

Указанные параметры являются:

nTiledExtractHeaders: набор заголовков для файла, его SQL-запрос, который возвращает одну строку. Мы создаем файл с этим и добавляем данные под ним. Так что может быть что-то вроде
CustomerID, CustomerName
идентификационное имя


nTiledExtractData: это наш набор данных, который может быть простым набором составленных имен
идентификационное имя
C000001, Ace Limited
C000002, Acme Inc
...
C045123, 中國客戶
...
C050001, 日本のお客様
...
C092345, Zyppy Zip Company

(используя запятую в каждом списке для представления конца каждого поля данных)

nTiledFileName: просто имя файла


public void Main()
{
    string pos = "00";
    try
    {
        pos = "01";
        string filename = Dts.Variables["User::nTiledFileName"].Value.ToString();
        pos = "02";
 //       DataSet ds = null;
        pos = "03";
        DataTable dtH = new DataTable();
        DataTable dtD = new DataTable();

        pos = "04";
        System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter();
        pos = "05";
        adapter.Fill(dtH, Dts.Variables["User::nTiledExtractHeaders"].Value);
        pos = "06";
        adapter.Fill(dtD, Dts.Variables["User::nTiledExtractData"].Value);
        pos = "07";
 //       ds.Tables.Add(dtH);
 //       ds.Tables.Add(dtD);
        pos = "08";
        System.Text.Encoding e = System.Text.Encoding.Unicode;
        System.Collections.Generic.List<string> header = null;

        pos = "09";
        if (dtD.ExtendedProperties.ContainsKey("Unicode") && (bool)dtD.ExtendedProperties["Unicode"])
        {
            pos = "10";
            e = System.Text.Encoding.Unicode;
        }

        pos = "11";
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(System.IO.File.Open(filename, System.IO.FileMode.Create), e))
        {
            pos = "12";
            header = new System.Collections.Generic.List<string>(dtH.Columns.Count);
            pos = "13";
            foreach (System.Data.DataColumn heading in dtH.Columns)
            {
                pos = "14";
                header.Add(heading.ColumnName);
            }
            pos = "15";
            file.WriteLine(string.Join("\t", header)); // write the headings
            pos = "16";
            foreach (System.Data.DataRow headingRow in dtH.Rows) //write the subheadings
            {
                pos = "17";
                System.Collections.Generic.IEnumerable<string> hFields = (headingRow.ItemArray).Select(Field => Field.ToString());
                pos = "18";
                file.WriteLine(string.Join("\t", hFields));
            }
            foreach (System.Data.DataRow dataRow in dtD.Rows) //write the data
            {
                pos = "19";
                System.Collections.Generic.IEnumerable<string> dFields = (dataRow.ItemArray).Select(Field => Field.ToString());
                pos = "20";
                file.WriteLine(string.Join("\t", dFields));
            }

        }

        pos = "21";
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    catch (Exception ex)
    {
        //An error occurred.
        Dts.Events.FireError(0, "Write TDF Files - " + pos, ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
        Dts.TaskResult = (int)ScriptResults.Failure;
    }

}


Что я уже пробовал:

Тест unicode or not - это хорошо, что мне действительно не нужно, поэтому я прокомментировал его и просто позволил всему кодироваться как Unicode. Мое решение работает, и это достаточно хороший обходной путь для этого приложения. Тот факт, что все файлы будут Unicode, не является проблемой, но я беспокоюсь о том, почему это происходит...и о потенциальных подобных ситуациях в будущем, как я могу этого избежать.
if (dtD.ExtendedProperties.ContainsKey("Unicode") && (bool)dtD.ExtendedProperties["Unicode"])
{
    pos = "10";
    e = System.Text.Encoding.Unicode;
}

1 Ответов

Рейтинг:
1

phil.o

Мне просто интересно, почему вы все равно пытаетесь "обнаружить" Юникод. .Чистые строки внутренне, используя представления Юникода. До тех пор, пока имена хранятся в базе данных с использованием Юникода, а также (нварчар), вы даже не должны утруждать себя обнаружением чего-либо вообще.
Сохраните его как unicode, извлеките из C# и сохраните обратно в файл unicode. Это было бы огромным улучшением вашего кода, так как это позволило бы вам избежать спагетти-кода.