1

请看下面的代码。

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 值转换为数据类型 int 时出错

这段代码有什么问题?

4

2 回答 2

4

首先,永远不要像这样构造你的查询。请改用参数化查询。

其次,错误消息非常清楚 - 您正在尝试转换为 int 一些 varchar 列,该列可能还包含一些文字字符,而不仅仅是数字......

第三,更喜欢“使用”语句而不是显式关闭连接。这样更安全。

于 2012-04-22T14:11:17.667 回答
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 内部的连接和查询,更不用说在ButtonClick事件处理程序中处理。

于 2012-04-22T14:13:13.970 回答