簡體   English   中英

無法將參數值從字符串轉換為DateTime的Int32

[英]Failed to convert parameter value from a String to a Int32 for DateTime

我有一個鏈接到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”,但現在卻給了我一個錯誤。

您是選擇錯誤數據類型的受害者。

DateOrdDateRec列類型更改為date類型 ,並將DateTime.Today直接傳遞給參數化查詢(因為僅保留DateTime date部分)。

[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;

您在哪里獲取文本並嘗試設置整數參數。 將該文本轉換為整數,然后設置您的integer參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM