请查看以下代码。
protected void Button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(constring);
SqlCommand cmd = new SqlCommand();
if (DropDownList3.SelectedItem.Text == "Economy")
{
seats = Convert.ToInt32(DropDownList1.SelectedItem.Text);
cmd.Connection = con;
con.Open();
cmd.CommandText = "select easeats from flight where fno='" + fn + "'";
int eds = Convert.ToInt32(cmd.ExecuteScalar());
if (eds > seats)
{
Panel2.Visible = true; //seats available
cl = DropDownList3.SelectedItem.Text;
seat = seats.ToString();
seats = eds;
}
else
{
Panel3.Visible = true; // seats not available
}
con.Close();
}
}
我收到错误:int eds = Convert.ToInt32(cmd.ExecuteScalar());
错误是
将varchar值转换为datatype int 时出错
此代码有什么问题?
答案 0 :(得分:4)
首先,永远不要像这样构建你的查询。改为使用参数化查询。
其次,错误信息非常清楚 - 您正在尝试将一些varchar列转换为int,这可能包含一些文字字符,而不仅仅是数字......
第三,在显式关闭连接时更喜欢“使用”语句。这样更安全。
答案 1 :(得分:2)
尝试替换:
int eds = Convert.ToInt32(cmd.ExecuteScalar());
使用:
int eds = 0;
int.TryParse(cmd.ExecuteScalar(), out eds);
以这种方式,如果转换失败,则没有问题,继续使用eds = 0 ...
另请注意,您对异常和连接生命周期的处理非常差,请考虑以这种方式替换整个块:protected void Button2_Click(object sender, EventArgs e)
{
using(var con = new SqlConnection(constring))
using(var cmd = con.CreateCommand())
{
if (DropDownList3.SelectedItem.Text == "Economy")
{
seats = Convert.ToInt32(DropDownList1.SelectedItem.Text);
con.Open();
cmd.CommandText = "select easeats from flight where fno='" + fn + "'";
int eds = 0;
object result = cmd.ExecuteScalar();
int.TryParse(result, out eds);
if (eds > seats)
{
Panel2.Visible = true; //seats available
cl = DropDownList3.SelectedItem.Text;
seat = seats.ToString();
seats = eds;
}
else
{
Panel3.Visible = true; // seats not available
}
}
}
}
当然,无论如何,你还应该考虑重构整个事情并将数据库和业务逻辑从UI逻辑中分离出来,一般来说,你永远不应该直接处理UI内部的连接和查询,尤其是{{1事件处理程序。