Не удалось преобразовать значение параметра из строки в 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;
Где вы берете текст и пытаетесь установить целочисленный параметр. Преобразуйте этот текст в целое число, а затем установите свой целочисленный параметр.