十进制到字符串"指定的强制转换无效"

时间:2016-03-03 13:17:42

标签: c# combobox textbox

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);
    }
}

ComboBox 文本框

此代码没问题,但" 指定演员无效"当我点击 ComboBox 中的项目/索引时出现。我不知道为什么。

decimPRICE 是PRICE(十进制18,2)。

2 个答案:

答案 0 :(得分: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线程中这样做。任何长时间运行的工作都应该在一个单独的线程中完成,或者使用异步操作。

答案 1 :(得分:3)

你应该像这样使用GetDecimal

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

请注意,decimPRICE现在是decimal而不是int

引发了您的异常,因为GetInt32无法将数据库小数转换为Int32