无法将参数值从 String 转换为 DateTime 的 Int32

Posted

技术标签:

【中文标题】无法将参数值从 String 转换为 DateTime 的 Int32【英文标题】:Failed to convert parameter value from a String to a Int32 for DateTime 【发布时间】:2015-10-09 10:53:21 【问题描述】:

我有一个链接到 SQL 数据库的 C# 表单,对于其中一列,我希望在每次添加新行时插入当前日期。我很困惑,因为在某一时刻,这段代码完全符合我的要求,然后在更改了一些东西之后,它现在不断抛出错误“无法将参数值从 String 转换为 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”,但现在它只是给我一个错误。

【问题讨论】:

为什么要使用文本来表示日期?如果您可能可以,您应该在数据库中使用Date 字段。至于您问题中的问题-我建议您在代码中明确进行解析,例如int.Parse(textBox2.Text)。我怀疑这就是问题所在,但你应该能够解决这个问题。 你确定不是从 textBox2 转换的 QuantRem int 值。 文本 那是问题所在?日期字符串在任何时候都没有进行任何转换 这只是为了记录时完成的......没有真正的数据功能。使用日期字段会解决问题吗? 我认为在您的代码 [DateOrd] 中输入的字段错误为 ("@DateReq", 【参考方案1】:

你是choosing the wrong data type的受害者。

DateOrdDateRec 列类型更改为date type,并将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 statement 自动处理您的连接、命令和适配器,而不是手动调用Close 方法。

【讨论】:

QuantRem 绝对是问题所在。谢谢! +1【参考方案2】:

正如其他人所说,当您可以/应该使用实际的 date 类型时,请不要使用文本...这将为您现在和将来节省很多麻烦。

但您的实际错误更有可能是这一行: da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;

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

【讨论】:

是的,QuantRem 是问题所在。 +1

以上是关于无法将参数值从 String 转换为 DateTime 的 Int32的主要内容,如果未能解决你的问题,请参考以下文章

无法在springboot中将'java.lang.string'的值从jsp转换为'java.localtime'

将数组值从字符串转换为int?

TimeStamp , "将参数值从 DateTime 转换为 Byte[] 失败。"

无法将值从因子转换为仅数字

将参数值从字符串转换为日期时间失败

“无法将 '(String) -> Bool' 类型的值转换为预期参数”