#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. Есть какие-нибудь трудности?
4. @AliK: FreeText может быть чем угодно, например, Two, 2, Level 4, System Customer Location 2 и т.д.
5. @Charlieface: Мне нравится эта идея. Конечно, это означает, что я должен изменить свой код и базу данных, но на данный момент это не окажет большого влияния. Я обязательно подумаю над этим.