Разделить строку на части, основываясь на значениях в базе данных

#c# #database #split

#c# #База данных #разделить

Вопрос:

Для моей компании я пишу дополнение для Autodesk Inventor, чтобы убедиться, что определенные свойства документа заполнены. Одно из этих свойств называется description . После записи значения в это свойство надстройка должна прочитать хранящееся там значение и показать его пользователю в форме. Но, когда описание создается пользователем, пользователь должен выбирать из списка значений, хранящихся в базе данных.

Существует три базы данных: TblPrefix:

 | ID | PrefixName    | Prefix |
|----|---------------|--------|
| 1  | System Layout | SL     |
| 2  | Sub Assembly  | MS     |
 

TblDescription1 amp; TblDescription2:

 | ID | Description    | Abbreviation |
|----|--------------- |--------------|
| 1  | Acces amp; Egress | Aamp;E          |
| 2  | Building       | *null*       |
| 3  | West           | W            |
| 4  | Infeed         | *null*       |
| 5  | Column Grid    | *null*       |
 

Описание строится с помощью префикса подчеркивания Описания1 Описание2 FreeText. Примером может быть SL_Column Grid West XXX, где

  • Префикс = SL (выбирается из базы данных)
  • Описание1 = Сетка столбцов (выбирается из базы данных)
  • Описание2 = Запад (выбирается из базы данных)
  • FreeText = XXX

Теперь мой вопрос заключается в том, как разделить значение (SL_Column Grid West XXX) на соответствующие части? Чтобы сделать это еще более сложным, некоторые описания имеют сокращение. Таким образом, Запад также может быть W, конвейер может быть CNV и т.д. В форме всегда отображается полное имя описания, а также имя префикса, а не сокращение.

На данный момент я могу прочитать префикс, подчеркивание и первое описание / сокращение. Я не знаю, как найти второе описание и свободный текст.

 //Read Description
            string txtDescription = readProperties.ReadDesignProperty("Description", oDoc).ToString();

            //try to read the description stored in the iProperty,
            //if empty set strings for the description to empty
            try
            {
                //split description at underscore
                string[] description = txtDescription.Split(new string[] { "_" }, StringSplitOptions.None);
                string prefix = description[0];
                string descriptionText = description[1];
                string firstWordDescription1 = Regex.Match(descriptionText, @"^([w-] )").Value;

                //get prefix name from database
                con.Open();
                SqlCommand cmd = new SqlCommand("Select PrefixName from TblPrefix Where Prefix = '"   prefix   "'", con);
                prefix = (string)cmd.ExecuteScalar();

                //try to get the first part of the description
                cmd = new SqlCommand("Select Description from TblDescription1 Where Description Like '%"   firstWordDescription1   "%'", con);
                string description1 = (string)cmd.ExecuteScalar();

                //if the first part of the description is an abbrevation, get the description name from the database
                //and set the description preview to use the abbreviation
                if (string.IsNullOrEmpty(description1))
                {
                    cmd = new SqlCommand("Select Description from TblDescription1 Where Abbreviation Like '%"   firstWordDescription1   "%'", con);
                    description1 = (string)cmd.ExecuteScalar();
                    abbreviation1 = true;

                }

                con.Close();

                comboBoxPrefix.SelectedIndex = comboBoxPrefix.FindStringExact(prefix);
                comboBoxDescription1.SelectedIndex = comboBoxDescription1.FindStringExact(description1);
            }
            catch
            {
                string prefix = string.Empty;
                string description1 = string.Empty;
                string description2 = string.Empty;
            }

            labelDescription.Text = CreateDescription();
 

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

1. Можете ли вы предоставить более подробную информацию о примерах данных, например, как будет выглядеть freetext?

2. если вы уже нашли 1-й desc, используйте substring, чтобы обрезать их, затем повторите то же самое для 2-го desc. Есть какие-нибудь трудности?

3. Первая Нормальная форма

4. @AliK: FreeText может быть чем угодно, например, Two, 2, Level 4, System Customer Location 2 и т.д.

5. @Charlieface: Мне нравится эта идея. Конечно, это означает, что я должен изменить свой код и базу данных, но на данный момент это не окажет большого влияния. Я обязательно подумаю над этим.