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)。
答案 0 :(得分:9)
听起来你可能只是想要:
decimal price = reader.GetDecimal(reader.GetOrdinal("PRICE"));
textBox7.Text = price.ToString("0.00");
基本上,decimal
和int
不是一回事,如果你把一个值存储为十进制,你几乎肯定不想丢失小数点后的所有内容
此外,现在我们可以看到更多代码,您应该立即停止 :
// 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
。