2011-06-23 72 views
-1

我請你幫助我與我的問題我想創建一個函數,輸出在下拉列表中的數據我的代碼去如下的設置我的參數:SqlCommand的asp.net C#

 public static List<string> GetTracks(out List<string> trackIds, string conferenceId) 
    { 

     var res = new List<string>(); 
     trackIds = new List<string>(); 
     var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
     SqlCommand cmd = new SqlCommand("select Track_name,Track_ID from TrackCommittee where Conference_id= @conferenceId", sqlCon); 
     DataSet ds = new DataSet(); 
     cmd.Connection.Open(); 
     cmd.Parameters.Add(new SqlParameter("@conferenceId", conferenceId)); 



     using (SqlDataReader sdr = cmd.ExecuteReader()) 
     { 
     while (sdr.Read()) 
     { 
     res.Add(sdr.GetString(sdr.GetOrdinal("Track_name"))); 
     trackIds.Add(sdr.GetInt32(sdr.GetOrdinal("Track_ID")).ToString()); 
     } 
       } 


     cmd.Connection.Close(); 
     cmd.Dispose(); 
     return res; 
    } 

感謝你提前

+2

這是您對您的SqlConnection一個使用塊絕對比您SqlDataReader的 –

+1

更重要,你的問題是究竟是什麼? – JohnFx

+0

是什麼問題? – Eranga

回答

4

重新寫這樣整個函數:

public static IEnumerable<ListItem> GetTracks(string conferenceId) 
{ 
    using (var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
    using (var cmd = new SqlCommand("select Track_name,Track_ID from TrackCommittee where Conference_id= @conferenceId", sqlCon)) 
    { 

     cmd.Parameters.Add("@conferenceId", SqlDbType.Int).Value = conferenceId; 
     sqlCon.Open(); 

     using (SqlDataReader sdr = cmd.ExecuteReader()) 
     { 
      while (sdr.Read()) 
      { 
       yield return new ListItem(sdr[0].ToString(), sdr[1].ToString()); 
      } 
     } 
    } 
} 

和更新您的調用代碼是這樣的:

if (string.IsNullOrEmpty(os.SelectedValue)) 
{ 
    os.Items.AddRange(GetTracks("all").ToArray()); 
} 

並用於更好的分離presention和數據層,我會修改GetTracks以返回KeyValuePairs,並調用從KeyValuePair向ListItem添加選擇投影。

+0

與代碼,我無法從我的負荷頁面調用它它不工作,如果(string.IsNullOrEmpty(os.SelectedValue)){ 名單 標識; var names = GetTracks(out ID,「all」); 對(INT I = 0;我 emilios

+0

@emilios - 我沒有注意到你有兩列在那裏。更新我的答案以反映這一點,並展示如何使用代碼。 –

0

我不知道你的數據集的目的在這裏。這是我過去使用過的語法。 (我覺得語法是否正確 - 我沒有在這裏我的代碼)

using (SqlDataReader sdr = cmd.ExecuteReader()) 
{ 
    while (sdr.Read()) 
    { 
    res.Add(sdr.GetString(sdr.GetOrdinal("Track_name"))); 
    trackIds.Add(sdr.GetInt32(sdr.GetOrdinal("Track_ID")).ToString()) 
    } 
} 

編輯:和在評論中指出,把周圍的SqlConnection一個使用,以節省您關閉/處置自己它。

2

你從來沒有真正接觸到結果集sdr

using (var sqlCon = new SqlConnection(...)) 
{ 
    sqlCon.Open(); 
    using (SqlCommand cmd = new SqlCommand("...", sqlCon) 
    { 
     cmd.Parameters.Add(new SqlParameter("@conferenceId", conferenceId)); 
     using (SqlDataReader sdr = cmd.ExecuteReader()) 
     { 
      while (sdr.Read()) 
      { 
       res.Add(sdr[0]); 
       trackIds.Add (srd[1]); 
      } 
     } 
    } 
    } 
    return res; 
0

你似乎沒有做你的SqlDataReader的東西。通常,您將有這樣的事情:

using (SqlDataReader sdr = cmd.ExecuteReader()) 
{ 
    while(sdr.Read()) 
    { 
     //whatever 
    } 
... 

現在它看起來像您正在執行的命令,然後什麼都不做的結果。我不確定DataTable如何發揮作用。