asp.net数据库连接

时间:2012-04-22 14:01:37

标签: c# asp.net

请查看以下代码。

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

时出错

此代码有什么问题?

2 个答案:

答案 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事件处理程序。