无法将 DateTime 的参数值从字符串转换为 Int32
Failed to convert parameter value from a String to a Int32 for DateTime
我有一个链接到 SQL 数据库的 C# 表单,对于其中一列,我希望在每次添加新行时插入当前日期。我很困惑,因为这段代码一度完全按照我的意愿行事,然后在更改了一些内容后,它现在一直抛出错误 "Failed to convert parameter value from a String to a Int32.",我不知道发生了什么。
这是我的 table 定义。我知道值类型可能有点随意,但我只关心日期是否存储为字符串。
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”,但现在它只是给我一个错误。
您是 choosing the wrong data type 的受害者。
将您的 DateOrd
和 DateRec
列类型更改为 date
type 并将您的 DateTime.Today
直接传递给您的参数化查询(因为您只保留 [= 的日期部分17=]).
[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
方法。
正如其他人所说,当您 could/should 使用实际的 date
类型时,请不要使用文本...现在和将来都会为您省去很多麻烦。
但你的实际错误更有可能是这一行:
da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;
您正在获取文本并尝试设置整数参数的位置。将该文本转换为整数,然后设置整数参数。
我有一个链接到 SQL 数据库的 C# 表单,对于其中一列,我希望在每次添加新行时插入当前日期。我很困惑,因为这段代码一度完全按照我的意愿行事,然后在更改了一些内容后,它现在一直抛出错误 "Failed to convert parameter value from a String to a Int32.",我不知道发生了什么。 这是我的 table 定义。我知道值类型可能有点随意,但我只关心日期是否存储为字符串。
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”,但现在它只是给我一个错误。
您是 choosing the wrong data type 的受害者。
将您的 DateOrd
和 DateRec
列类型更改为 date
type 并将您的 DateTime.Today
直接传递给您的参数化查询(因为您只保留 [= 的日期部分17=]).
[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
方法。
正如其他人所说,当您 could/should 使用实际的 date
类型时,请不要使用文本...现在和将来都会为您省去很多麻烦。
但你的实际错误更有可能是这一行:
da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;
您正在获取文本并尝试设置整数参数的位置。将该文本转换为整数,然后设置整数参数。