2011-06-23 40 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如何发挥作用。