C # - Реализация Enum внутри кнопки (создать новую запись) - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь реализовать Enum в кнопке «Сохранить» (которая вставляет новые записи в БД, подключенную к приложению Visual Studio WinForms).

В этом случае у меня есть книги и таблицы категорий. Категория также является внешним ключом в таблице книг (как CategoryID, который должен принимать только тип данных int).

Учитывая вышесказанное, я бы хотел, чтобы приложение понимало / преобразовывало строковое значение в значение типа int, например:

Если я введу значение «История» в текстовом поле «Категория» в приложении и заполню остальные детали, необходимые для вставки новой записи книги в БД, и, наконец, нажму кнопку «Сохранить», мне нужно, чтобы приложение понимало, что «История» будет отражать идентификатор (в данном случае, идентификатор: «4») в таблице категорий.

Короче говоря, я не хочу вводить значения int в приложении - я хочу ввести Имя категории в текстовом поле CategoryID.

   private void btnSave_Click(object sender, EventArgs e)
   {

 string ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename= 
 C:\Program Files\Microsoft SQL 
 Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\Library System Project.mdf 
 ;Integrated Security=True;Connect Timeout=30";

        string Query = "insert into Books (BookName, BookAuthor, CategoryID, ClassificationID, BookAvailabilityQuantity, Price) values ('" + this.txtName.Text.Trim() + "','" + this.txtAuthor.Text.Trim() + "','" + this.txtCategory.Text.Trim() + "','" + this.txtClassification.Text.Trim() + "','" + this.txtAvailabilityQuantity.Text.Trim() + "','" + this.txtPrice.Text.Trim() + "');";

        SqlConnection DBCon = new SqlConnection(ConnectionString);
        SqlCommand DBCommand = new SqlCommand(Query, DBCon);
        SqlDataReader DBReader;

        try
        {
            DBCon.Open();
            DBReader = DBCommand.ExecuteReader();
            MessageBox.Show("New book record added to the system.", "Library System", MessageBoxButtons.OK);

            while (DBReader.Read())
            {

            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        finally
        {
            // *** If you're going to be opening a connection be sure to close it ***
            // *** Finally blocks work well for this ***
            DBCon.Close();

            this.txtName.ResetText();
            this.txtAuthor.ResetText();
            this.txtCategory.ResetText();
            this.txtClassification.ResetText();
            this.txtAvailabilityQuantity.ResetText();
            this.txtPrice.ResetText();
        }
    }

Ответы [ 3 ]

0 голосов
/ 19 мая 2019

Если я правильно понимаю ваш вопрос, есть разные подходы к тому, чего вы пытаетесь достичь. Откуда вы хотите, чтобы этот enum происходил? На самом деле вы можете создать перечисление с категориями и их респектабельным значением и отобразить их для выбора пользователем, например:

public enum Categories
{
   SciFi = 1,
   ...
   History = 4,
   ...
}

как ответил якобский, и вы также можете получать эти категории из базы данных (таким образом, делая их динамическими, например, вы можете добавлять и удалять категории из списка без необходимости изменять статический код, компилировать его и повторно развертывать). Обычно в большинстве случаев обычной практикой является хранение таких значений в базе данных, в таблице со столбцами ID и CategoryName.

0 голосов
/ 19 мая 2019

Если я введу значение «История» в текстовом поле «Категория» в приложении, заполню остальные данные, необходимые для вставки новой записи книги в БД, и, наконец, нажму кнопку «Сохранить», мне нужно приложениечтобы понять, что «История» будет отражать идентификатор (в данном случае идентификатор: «4») в таблице категорий.

Если у вас нет бизнес-правил, привязанных к конкретным значениям emum, я предлагаюне кодируйте значения в приложении жестко, вместо этого загрузите имя категории и значения идентификатора из таблицы базы данных Category.Это также может обеспечить целостность данных с отношением внешнего ключа к таблице Book и позволить добавлять новые категории без изменений кода.

Лучшим пользовательским интерфейсом будет комбинированный список / список, из которого пользователи могут выбиратьпо имени вместо текстового поля произвольной формы.Затем код может использовать идентификатор выбранного значения без дополнительной проверки или поиска для вставки и базы данных.

В отдельной заметке используйте параметризованные запросы для повышения производительности и безопасности.Никогда не следует создавать SQL-запросы, используя конкатенацию строк из ненадежных источников.

0 голосов
/ 19 мая 2019

Создайте enum для своих категорий, например:

enum BookCategory
{
    Science=1,
    Art,
    Romance,
    History
}

Затем вы можете написать:

if(Enum.TryParse<BookCategory>(txtCategory.Text.Trim(), out BookCategory categoryId))
    Console.WriteLine((int)categoryId);
else
    Console.WriteLine("Category not recognised");

, которая будет печатать 4, если txtCategory содержит "История».

...