2012-04-22 99 views
1

請看下面的代碼。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值定義了int類型

什麼不對這個代碼?

+0

數據庫中的easeats的類型是什麼? ExecuteScalar通常用於獲取count,它返回結果集第一行的第一列,可能是您得到的結果爲null,這就是您遇到問題的原因。請告訴我們在db中的easeats的類型以及它在數據庫中運行查詢時返回的內容 – Habib 2012-04-22 14:12:01

+0

@user ...哇代碼質量在這裏很差,我希望我永遠不必採用任何平面該公司正在使網站的... :)開玩笑...:D – 2012-04-22 14:15:25

回答

4

首先,永遠不要像這樣構造你的查詢。改用參數化查詢。

其次,該錯誤信息是很清楚 - 你想轉換爲int一些VARCHAR列,這可能包含一些文字字符,以及不僅數...

第三,喜歡「用」通過明確關閉連接的語句。這樣更安全。

2

嘗試更換:

int eds = Convert.ToInt32(cmd.ExecuteScalar()); 

有:

int eds = 0; 

int.TryParse(cmd.ExecuteScalar(), out 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事件處理程序。

+0

我得到一行錯誤: int.TryParse(result,out eds); ..它有一些無效的爭論; TryParse(String,out int) – kunalranjan08 2012-04-22 14:31:09

+0

在您將查詢檢查的結果對象分配給null並且在檢查結果不爲null之後嘗試使用result.ToString()進行解析之後嘗試解析。 – 2012-04-22 14:34:29

+0

我收到一行錯誤: int.TryParse(result,out eds); ..它有一些無效的爭論; TryParse(String,out int) - – kunalranjan08 2012-04-22 14:44:47