Проблема добавления новых строк в DataTable - PullRequest
0 голосов
/ 14 июля 2011

Вот мои данные:

DataTable CSVFile = new DataTable();
CSVFile.Columns.Add("Occurrence_Date", typeof(DateTime));
CSVFile.Columns.Add("Preanalytical_Before_Testing", typeof(string));
CSVFile.Columns.Add("Cup_Type", typeof(string));
CSVFile.Columns.Add("Analytical_Testing_Phase", typeof(string));
CSVFile.Columns.Add("Area", typeof(string));
CSVFile.Columns.Add("Postanalytical_After_Testing", typeof(string));
CSVFile.Columns.Add("Other", typeof(string));
CSVFile.Columns.Add("Practice_Code", typeof(string));
CSVFile.Columns.Add("Comments", typeof(string));

Я пытаюсь добавить в него новую строку:

DataRow newRow = CSVFile.NewRow();
newRow["Occurrence_Date"] =  Convert.ToDateTime(splitcsvlines[GetColumnsNames.Occurrence_Date]);
newRow["Preanalytical_Before_Testing"] = splitcsvlines[GetColumnsNames.Preanalytical_Before_Testing];
newRow["Cup_Type"] = splitcsvlines[GetColumnsNames.Cup_Type];
newRow["Analytical_Testing_Phase"] = splitcsvlines[GetColumnsNames.Analytical_Testing_Phase];
newRow["Area"] = splitcsvlines[GetColumnsNames.Area];
newRow["Postanalytical_After_Testing"] = splitcsvlines[GetColumnsNames.Postanalytical_After_Testing];
newRow["Other"] = splitcsvlines[GetColumnsNames.Other];
newRow["Practice_Code"] = splitcsvlines[GetColumnsNames.Practice_Code];
newRow["Comments"] = splitcsvlines[GetColumnsNames.Comments];
CSVFile.Rows.Add(newRow);

Однако я получаю сообщение об ошибке

Инициализатор типа для BulkUploadToLOMDatabase.GetColumnsNames вызвал исключение.

Я пытался просто сделать newRow["Cup_Type"] = "something" или newRow[2] = "something" и все еще получаю ту же ошибку

Вот как выглядит класс:

class GetColumnsNames
{

  public static int Occurrence_Date = Convert.ToInt16(ConfigurationSettings.AppSettings["Occurrence_Date"].ToString());
  public static int Preanalytical_Before_Testing = Convert.ToInt16(ConfigurationSettings.AppSettings["1_0_Preanalytical_Before_Testing"].ToString());
  public static int Cup_Type = Convert.ToInt16(ConfigurationSettings.AppSettings["Cup_Type"].ToString());
  public static int Analytical_Testing_Phase = Convert.ToInt16(ConfigurationSettings.AppSettings["Analytical_Testing_Phase"].ToString());
  public static int Area = Convert.ToInt16(ConfigurationSettings.AppSettings["Area"].ToString());
  public static int Postanalytical_After_Testing = Convert.ToInt16(ConfigurationSettings.AppSettings["Postanalytical_After_Testing"].ToString());
  public static int Other = Convert.ToInt16(ConfigurationSettings.AppSettings["Other"].ToString());
  public static int Practice_Code = Convert.ToInt16(ConfigurationSettings.AppSettings["Practice_Code"].ToString());
  public static int Comments = Convert.ToInt16(ConfigurationSettings.AppSettings["Comments"].ToString());
}

Что я делаю не так? Что не так с моим классом?

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

The type initializer for BulkUploadToLOMDatabase.GetColumnsNames' threw an exception.

Это означает, что CLR пытался создать ваш тип, но это не удалось. Поскольку у вас есть набор статических переменных, которые полагаются на вызов, который может завершиться ошибкой KeyNotFound FormatExecption NullException, вы должны вместо этого преобразовать этот класс в singleton .

Таким образом, вы можете правильно отследить любые проблемы с ConfigurationSettings.AppSettings

Кроме того, вы можете рассмотреть возможность использования system.configuration.configurationmanager . Это если вы не в 1.1. ConfigurationSettings.AppSettings устарела в 2.0

1 голос
/ 14 июля 2011

Я думаю, что проблема возникает из-за этой строки кода:

public static int Occurrence_Date = Convert.ToInt16(ConfigurationSettings.AppSettings["Occurrence_Date"].ToString());

значения int32 не могут быть преобразованы в значения DateTime:

newRow["Occurrence_Date"] =  Convert.ToDateTime(splitcsvlines[GetColumnsNames.Occurrence_Date]);

Как сказал @LarsTech, ваш код, связанный с dataTable, правильный. Самым опасным является код, который я выложил выше. Пожалуйста, реализуйте его в простой консоли, где это значение (ConfigurationSettings.AppSettings ["Occurrence_Date"]. ToString ()) преобразуется в int15, а затем в DateTime. Каковы ваши результаты?

1 голос
/ 14 июля 2011

Как уже упоминалось, сборка / загрузка таблицы в порядке ... вот быстрый тест, использующий порядковый номер позиции в сравнении с именами столбцов для загрузки 10 случайных значений.В ваших комментариях вы сказали, что отладка показывает правильные значения, если так, то все должно работать.Просто «убедитесь», что вы получаете ожидаемый тип данных для каждого значения столбца.

        DataTable CSVFile = new DataTable();
        CSVFile.Columns.Add("Occurrence_Date", typeof(DateTime));
        CSVFile.Columns.Add("Preanalytical_Before_Testing", typeof(string));
        CSVFile.Columns.Add("Cup_Type", typeof(string));
        CSVFile.Columns.Add("Analytical_Testing_Phase", typeof(string));
        CSVFile.Columns.Add("Area", typeof(string));
        CSVFile.Columns.Add("Postanalytical_After_Testing", typeof(string));
        CSVFile.Columns.Add("Other", typeof(string));
        CSVFile.Columns.Add("Practice_Code", typeof(string));
        CSVFile.Columns.Add("Comments", typeof(string));

        for (int i = 0; i < 10; i++)
        {
            DataRow row = CSVFile.NewRow();
            row[0] = DateTime.Now.AddDays(i);
            row[1] = "Field 2";
            row[2] = "Field 3";
            row[3] = "Field 4";
            row[4] = "Field 5";
            row[5] = "Field 6";
            row[6] = "Field 7";
            row[7] = "Field 8";
            row[8] = "Field 9";

            CSVFile.Rows.Add(row);
        }
1 голос
/ 14 июля 2011

Убедитесь, что ConfigurationSettings.AppSettings имеет те целочисленные значения, которые вы запрашиваете. Похоже, это выдает ошибку.

Ваш код данных и данных в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...