Как прочитать / получить строковое представление перечисления (в качестве внешнего ключа) в таблице MS Access? - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь прочитать базу данных MS Access, используя класс OleDbConnection в C #.

Пока я могу подключаться к БД и читать конкретную таблицу и каждую ее строку. Я могу без проблем получить поля, основанные на строке. Но некоторые столбцы являются внешними ключами (numeric), и я получаю числовое значение вместо строкового (как это видно в MS Access).

Вот краткий пример того, как я продолжаю:

public void ReadDB(OleDbConnection connection) 
{
    connection.Open();
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter("Select * From T_MYTABLE", connection);
    DataSet localData = new DataSet();
    dataAdapter.Fill(localData);

    foreach (DataRow dataRow in localData.Tables[0].Rows)
    {
        string name = dataRow["APP_NAME"].ToString(); 
        string status = dataRow["APP_STATUS"].ToString();
    }

    connection.Close();
}

На самом деле имя переменной содержит ожидаемое значение, но status - это числовое значение перечисления, представляющего состояние.

Если мы посмотрим данные с помощью MS Access, мы получим, например:

Пример таблицы MS Access

И статус определяется следующим образом: Определение Enum

Так что на самом деле для этой строки я получаю:

  • name = "MyApplication" что правильно
  • status = 83 что должно быть "ростом"

Есть ли способ получить строковое значение вместо этого? Должен ли я использовать другой способ чтения таблицы (вместо использования DataSet)?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы можете преобразовать строковое значение в перечисление, используя Enum.Parse

MyEnum status= (MyEnum) Enum.Parse(typeof(MyEnum), dataRow["APP_STATUS"].ToString());

Подробнее см. здесь .

0 голосов
/ 11 апреля 2019

В .NET Core и .NET> 4 есть общий метод разбора:

  Enum.TryParse(dataRow["APP_STATUS"].ToString(), out MyEnum status);

Это также защитит от ситуации с dbnull.

Кроме того, желательно иметь значение по умолчанию для перечисления, если APP_STATUS не сопоставляется с перечислением.

 if (string.IsNullOrWhiteSpace(dataRow["APP_STATUS"].ToString()))
 {
    return MyEnum.None;
 }
 Enum.TryParse(dataRow["APP_STATUS"].ToString(), out MyEnum status);
...