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

Per*_*ist 1 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它在ComboBoxTextbox中

此代码没问题,但是当我在ComboBox中单击项目/索引时出现" 指定的强制转换无效 " .我不知道为什么.

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

Jon*_*eet 9

听起来你可能只是想要:

decimal price = reader.GetDecimal(reader.GetOrdinal("PRICE"));
textBox7.Text = price.ToString("0.00");
Run Code Online (Sandbox Code Playgroud)

基本上,decimal并且int是不一样的东西,如果你存储的值作为一个小数,你几乎肯定不希望在小数点后只是血本无归.

此外,现在我们可以看到更多代码,您应该立即停止这样做:

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

这很容易受到SQL注入攻击 - 您应该使用参数化SQL:

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

这应该是你改变的第一件事 - 目前这是一个巨大的安全漏洞.

应该每次都打开连接,并在using语句中使用它(以及命令和读取器),以便它们得到适当的处理.

接下来,如果有多个匹配产品,您实际上只使用最后一个结果 - 那是您想要的吗?

接下来,你只使用价格 - 为什么要使用SELECT *

最后,这看起来像WinForms GUI或类似 - 在这种情况下,您不应该在UI线程中执行此操作.任何长时间运行的工作都应该在一个单独的线程中完成,或者使用异步操作.