2015-07-20 62 views
1

我有一個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

回答

3

你是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

1

正如其他人所說的,當您可以/應該使用實際的date類型時,請不要使用文本......它將爲您現在和未來節省很多麻煩。

但你實際的錯誤是更可能是這一行: da.InsertCommand.Parameters.Add("@QuantRem", SqlDbType.Int).Value = textBox2.Text;

如果你正在服用的文字,試圖把一個整數參數。將該文本轉換爲整數,然後設置您的整數參數。

+0

Yup QuantRem是問題。+1 – anesthetic

相關問題