C# преобразование не удалось при преобразовании nvarchar в int - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь вставить значения в базу данных, но получаю сообщение об ошибке

"Не удалось преобразовать значение nvarchar 'Year' в тип данных int"

в c#. Я не знаю, как это исправить.

Вот мой код:

private void btnSave_Click(object sender, EventArgs e)
{
    try
    {
        if (MessageBox.Show("Are you sure you want to save this book?", "Saving Record", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
            //open connection to the database
            cn.Open();
            //command to be executed on the database
            cm = new SqlCommand("INSERT INTO Books(BookTitle, Edition, Genre, Author, Publisher, Year, ISBN) VALUES (@BookTitle, @Edition, @Genre, @Author, @Publisher, @Year, @ISBN )", cn);
            //set paramaters value
            cm.Parameters.AddWithValue("@booktitle", txtBook.Text);
            cm.Parameters.AddWithValue("@edition", txtEdition.Text);
            cm.Parameters.AddWithValue("@genre", txtGenre.Text);
            cm.Parameters.AddWithValue("@author", txtAuthor.Text);
            cm.Parameters.AddWithValue("@publisher", txtPublisher.Text);
            cm.Parameters.AddWithValue("@year", txtYear.Text);
            cm.Parameters.AddWithValue("@isbn", txtISBN.Text);
            //ask db to execute query
            cm.ExecuteNonQuery();
            //close connection
            cn.Close();
            MessageBox.Show("Record has been sucessfully saved!");
            Clear();
            frmlist.LoadRecords();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Ответы [ 4 ]

3 голосов
/ 20 февраля 2020

Предполагая, что поле года в вашей таблице является целым числом, вы должны привязать к нему целую переменную:

cm.Parameters.AddWithValue("@year", Int64.Parse(txtYear.Text));
0 голосов
/ 20 февраля 2020

Сначала преобразовать значение

String yr = txtYear.Text;
int yr = Convert.ToInt32(yr);

cm.Parameters.AddWithValue("@year",""+yr );
0 голосов
/ 20 февраля 2020

Если вы просто добавите int.Parse (txtYear.Text), как предлагают некоторые другие комментарии, и пользователь введет любые не-di git символы в поле txtYear, вы получите исключение.

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

Оформить заказ в этой статье по цифрам c вводам в Windows Формах: https://www.c-sharpcorner.com/blogs/how-to-create-a-textbox-accepting-only-numbers-in-windows-forms1

Это, как говорится, если вы по какой-то причине вынуждены использовать ввод текста :

Я бы попытался проанализировать txtYear.Text как целое число, используя int.TryParse(txtYear.Text, out int year) перед передачей его в команду SQL. Вы можете сделать что-то вроде следующего в верхней части функции, чтобы проверить поле и выдать более значимое исключение, если пользователь ввел текст в поле вместо всех чисел:

if(!int.TryParse(txtYear.Text, out int year))
{
  throw new Exception("Only digits are allowed in the year field");
}

//the rest of your code goes here
//and use the year variable for the @year parameter
0 голосов
/ 20 февраля 2020

Ваш Year является строковым типом и должен быть преобразован в число (целое число). Вы можете использовать что-то вроде

cm.Parameters.AddWithValue("@year", int.Parse(txtYear.Text));

Убедитесь, что текст года не пустой и может быть преобразован в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...