Не удалось преобразовать значение параметра из строки в Int32 для DateTime

У меня есть форма C#, связанная с базой данных SQL, и для одного из столбцов я хочу вставлять текущую дату каждый раз, когда добавляется новая строка. Я сбит с толку, потому что в какой-то момент этот код делал именно то, что я хотел, а затем, после изменения нескольких вещей, теперь продолжает выдавать ошибку "Не удалось преобразовать значение параметра из строки в тип Int32". и я не знаю, что случилось Вот мое определение таблицы. Я знаю, что типы значений, возможно, немного произвольны, но меня волнует только то, что дата хранится в виде строки.

CREATE TABLE [dbo].[InvTable] (
[ID]       INT           IDENTITY (1, 1) NOT NULL,
[Item]     NVARCHAR (50) NULL,
[QuantRem] INT           NULL,
[Type]     NCHAR (10)    NULL,
[DateOrd]  NCHAR(10)    NULL,
[QuantOrd] INT           NULL,
[Received] BIT           NULL,
[DateRec]  NCHAR(10)    NULL,
PRIMARY KEY CLUSTERED ([ID] ASC)
);

И код на форме ниже. Вторая дата будет определена иначе, но моя главная задача - избавиться от ошибки в названии.

    private void Submitbutton1_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(textBox1.Text))
        {
            MessageBox.Show("Cannot Submit Empty Request");
            return;
        }
        if (comboBox1.SelectedItem == null)
        {
            MessageBox.Show("Please Use Drop Down Menu To Select Item Category");
            return;
        }
        SqlDataAdapter da = new SqlDataAdapter();
        da.InsertCommand = new SqlCommand("INSERT INTO InvTable VALUES(@Item, @QuantRem, @Type, @DateReq, @QuantOrd, @Received, @DateRec)", con);
        da.InsertCommand.Parameters.Add("@Item", SqlDbType.NChar).Value = textBox1.Text;
        da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;
        da.InsertCommand.Parameters.Add("@Type", SqlDbType.NChar).Value = comboBox1.Text;
        da.InsertCommand.Parameters.Add("@DateReq", SqlDbType.NChar).Value = DateTime.Today.ToString("d");
        da.InsertCommand.Parameters.Add("@QuantOrd", SqlDbType.Int).Value = 0;
        da.InsertCommand.Parameters.Add("@Received", SqlDbType.Bit).Value = 0;
        da.InsertCommand.Parameters.Add("@DateRec", SqlDbType.NChar).Value = DateTime.Today.ToString("d");
        con.Open();
        da.InsertCommand.ExecuteNonQuery();
        da.SelectCommand = new SqlCommand("SELECT * FROM InvTable WHERE Received=0", con);
        con.Close();
        ds.Clear();
        da.Fill(ds);
        invTableDataGridView.DataSource = ds.Tables[0];
        textBox1.Clear();
    }

Таким образом, этот код раньше работал, давая мне строку "20.07.2015", но теперь он просто выдает ошибку.

2 ответа

Решение

Вы стали жертвой неправильного выбора типа данных.

Измени свой DateOrd а также DateRec типы столбцов для date введите и передайте свой DateTime.Today непосредственно к параметризованному запросу (поскольку вы сохраняете только часть даты DateTime).

[DateOrd]  date    NULL,
...
...
[DateRec]  date   NULL,

а также

da.InsertCommand.Parameters.Add("@DateReq", SqlDbType.Date).Value = DateTime.Today;
da.InsertCommand.Parameters.Add("@DateRec", SqlDbType.Date).Value = DateTime.Today;

Также для QuantRem колонка, похоже, нужно разобрать textBox2.Text значение в int, прежде чем передать его в качестве параметра.

da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = int.Parse(textBox2.Text);

Не забудьте использовать using заявление, чтобы избавиться от ваших соединений, команд и адаптеров автоматически вместо вызова Close методы вручную.

Как уже говорили другие, не используйте текст, когда вы могли / должны использовать фактический date типа... это избавит вас от многих хлопот сейчас и в будущем.

Но вашей реальной ошибкой, скорее всего, будет эта строка:da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;

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

Другие вопросы по тегам