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)
它在ComboBox到Textbox中
此代码没问题,但是当我在ComboBox中单击项目/索引时出现" 指定的强制转换无效 " .我不知道为什么.
decimPRICE是PRICE(十进制18,2).
听起来你可能只是想要:
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线程中执行此操作.任何长时间运行的工作都应该在一个单独的线程中完成,或者使用异步操作.