无法将参数值从字符串转换为Int32的DateTime

无法将参数值从字符串转换为Int32的DateTime

问题描述:

我有一个C#表单链接到SQL数据库,并且对于希望每次添加新行时插入当前日期的列之一。我很困惑,因为在某一时刻,这段代码正在做我想要的东西,然后在改变了一些东西后,它现在一直抛出错误“无法将参数值从字符串转换为Int32。”我不知道发生了什么。 这是我的表格定义。我知道值类型可能有点任意,但我所关心的是日期存储为字符串。无法将参数值从字符串转换为Int32的DateTime

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”,但现在它只是给了我一个错误。

+1

为什么你用文本代表一个日期呢?如果您可能*可以,您应该在数据库中使用'Date'字段。至于你的问题中的问题 - 我建议你明确地做你的代码解析,例如'int.Parse(textBox2.Text)'。我*怀疑*这是问题所在,但你应该能够解决这个问题。 –

+1

您确定它不是从textBox2转换的QuantRem ** int **值。 **文本**这就是问题所在?日期**字符串**在任何时间点都没有经过任何转换 –

+0

这只是为了完成日志时的目的......没有真正的数据功能。将使用日期字段解决问题? – anesthetic

你是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方法您的连接,命令和适配器。

+0

QuantRem肯定是问题,谢谢!+1 – anesthetic

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

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

如果你正在服用的文字,试图把一个整数参数。将该文本转换为整数,然后设置您的整数参数。

+0

Yup QuantRem是问题。+1 – anesthetic