Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlCommand asp.net C_C#_Asp.net_Sql - Fatal编程技术网

C# SqlCommand asp.net C

C# SqlCommand asp.net C,c#,asp.net,sql,C#,Asp.net,Sql,我请你帮我解决我的问题我正在尝试创建一个函数,在下拉列表上输出数据设置我的参数我的代码如下: public static List<string> GetTracks(out List<string> trackIds, string conferenceId) { var res = new List<string>(); trackIds = new List<string>();

我请你帮我解决我的问题我正在尝试创建一个函数,在下拉列表上输出数据设置我的参数我的代码如下:

        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;
    }

提前感谢您

我不确定您的数据集的用途。这是我过去使用过的语法。我认为语法是正确的-我这里没有我的代码

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周围放置一个using,以保存您自己关闭/处理它。

您从未实际接触过结果集sdr:


重新编写整个函数,如下所示:

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());
}
using (SqlDataReader sdr = cmd.ExecuteReader())
{
   while(sdr.Read())
   {
      //whatever
   }
...

为了更好地分离呈现层和数据层,我将修改getTrack以返回KeyValuePairs,并调用从KeyValuePairs向ListItem添加选择投影。

您似乎没有对SqlDataReader做任何事情。通常情况下,您会遇到如下情况:

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());
}
using (SqlDataReader sdr = cmd.ExecuteReader())
{
   while(sdr.Read())
   {
      //whatever
   }
...

现在看起来您正在执行该命令,然后对结果不做任何处理。我也不确定DataTable是如何发挥作用的。

与SqlDataReader相比,SqlConnection周围有一个using块更重要,而您的问题到底是什么?我猜问题是数据集中没有任何内容。。。有吗?我已将代码更改为这样,但仍有一个错误System.Data.SqlClient.SqlException:将nvarchar值“all”转换为数据类型int时,转换失败。是的,当您为int typeTrack_ID传入all时,SQL将显示一个异常。将函数更改为接受conferenceId的int,而不是字符串。然后修复代码以单独处理'all'cae,尝试使用不同的查询。使用该代码,我无法从加载页调用它。如果string.IsNullOrEmptyos.SelectedValue{List IDs;var names=GetTracksout IDs,all;for int i=0;i