日志含义DateTime的参数值从String类型转换为Int32类型失败

本文关键字:类型转换 String Int32 失败 类型 DateTime 参数 日志 | 更新日期: 2023-09-27 18:03:27

我有一个链接到SQL数据库的c#表单,对于其中一列,我希望在每次添加新行时插入当前日期。我很困惑,因为在某一点上,这段代码做的正是我想要的,然后在改变了一些事情之后,它现在一直抛出错误"未能将参数值从字符串转换为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();
    }

所以这个代码曾经在一个点上工作,给我一个字符串"07/20/2015",但现在它只是给我一个错误。

日志含义DateTime的参数值从String类型转换为Int32类型失败

您是选择错误数据类型的受害者。

DateOrdDateRec列类型更改为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;

您正在获取文本并尝试设置整数参数。将该文本转换为整数,然后设置整数参数。