2016-03-03 63 views
1
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    SqlCommand cmd = new SqlCommand(@"Select * FROM PRODUCTS where [PRODUCT CODE] = '" + comboBox4.Text + "'", con); 
    SqlDataReader myReader; 
    try 
    { 
     con.Open(); 
     myReader = cmd.ExecuteReader(); 

     while (myReader.Read()) 
     { 
      int decimPRICE = myReader.GetInt32(myReader.GetOrdinal("PRICE")); 
      string PRICE = decimPRICE.ToString("0.00"); 
      textBox7.Text = PRICE; 

     } 
     con.Close(); 
    } 
    catch (Exception exe) 
    { 
     MessageBox.Show(exe.Message); 
    } 
} 

其在組合框文本框十進制轉換爲字符串「指定的轉換無效」

該代碼是好的,但「指定的轉換是無效」當我點擊正在出現item/index in ComboBox。我不知道爲什麼。

decimPRICE是PRICE(小數點18,2)。

+1

不,根據您的聲明decimPrice是一個整數, – Kevin

+1

請顯示完整的堆棧跟蹤,並指出您的代碼所指的是哪一行。 –

回答

9

這聽起來像你可能只是想:

decimal price = reader.GetDecimal(reader.GetOrdinal("PRICE")); 
textBox7.Text = price.ToString("0.00"); 

基本上decimalint是不一樣的東西,如果你存儲的值作爲一個小數,你幾乎肯定不希望在小數點後面丟失一切。

此外,現在我們可以看到更多的代碼,你應該停止這樣做立即

// WARNING! WARNING! SQL INJECTION ATTACK! 
SqlCommand cmd = new SqlCommand(@"Select * FROM PRODUCTS where [PRODUCT CODE] = '" + comboBox4.Text + "'", con); 

這是容易SQL Injection Attacks - 你應該使用參數化的SQL:

SqlCommand cmd = new SqlCommand("Select * FROM PRODUCTS where [PRODUCT CODE] = @code, con); 
cmd.Parameters.Add("@code", SqlDbType.Varchar).Value = comboBox4.Text; 

這應該是你改變的第一件事 - 這是一個目前的大漏洞安全漏洞。

你應該每次打開新的連接,並在using語句中使它(和命令,和讀者),以便他們適當地處置。

接下來,如果有多個匹配產品,那麼您實際上只使用最後一個結果 - 是您想要的嗎?

接下來,您只使用價格 - 那麼爲什麼要使用SELECT *

最後,這看起來像一個WinForms GUI或類似的 - 在這種情況下,你不應該在UI線程中這樣做。任何長時間運行的工作應該在單獨的線程中完成,或者使用異步操作。

+0

是的,現在我又學到了一些新東西。這對我有幫助。 – Perfectionist

+0

@完美主義者:看看我的編輯 - 在這段代碼中有很多改進。 –

+0

Oooh這太多了一天,好生病會再讀一遍。你只是不幫助我,但你也教我。我真的很感激,SIR! :) – Perfectionist

3

你應該使用GetDecimal這樣的:

decimal decimPRICE = myReader.GetDecimal(myReader.GetOrdinal("PRICE")); 
string PRICE = decimPRICE.ToString("0.00"); 
textBox7.Text = PRICE; 

注意decimPRICE是目前decimal代替int

由於GetInt32無法將數字小數點轉換爲Int32,因此引發了您的異常。

+0

剛剛看到OP添加了更多的代碼...... Jon Skeet對此進行了充分的討論,所以我不再重複。 –