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

#c# #ms-access #oledbconnection

#c# #ms-access #oledbconnection

Вопрос:

Я пытаюсь прочитать базу данных 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();
}
  

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

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

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

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

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

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

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

Ответ №1:

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

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

Смотрите здесь для получения более подробной информации.

Комментарии:

1. Большое вам спасибо за помощь.

2. @Nushi если чей-то ответ решил вашу проблему — примите этот ответ

Ответ №2:

В .NET Core и .NET> 4 существует общий метод синтаксического анализа:

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

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

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

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