首页 > 解决方案 > 访问 DataReader 值时出错(在 SqlDataReader 中访问连接表结果)

问题描述

更新 - 问题已解决

以防一次检索所有数据,使用单个 SQL 语句检索连接表结果,但无法访问它并收到下面的错误

异常详细信息:System.IndexOutOfRangeException:crsName

顺便说一句,任何人都请建议一种更方便的方法来处理需要显示 JOIN 结果的 GridView。而不是这种方法 - https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.datacontrolfieldcollection.add?view=netframework-4.8

BoundField courseBF = new BoundField();
courseBF.DataField="courseName";
courseBF.HeaderText="Course Name";
//Which is stated in Microsoft Document

这是代码接收错误

    string userID = (string)Session["userID"];
    string sql = "SELECT courseID from gpaSem where stuID=@userID";
    string temp = "";
    string temp02 = "";
    string[] crsID;
    string[] crsName;
    string[] grade;
    SqlConnection con = new SqlConnection(cs);
    SqlCommand cmd = new SqlCommand(sql, con);
    cmd.Parameters.AddWithValue("@userID", userID);

    con.Open();
    SqlDataReader dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        temp += ("!" + dr["courseID"]);
    }
    crsID = temp.Split('!');
    crsID = crsID.Skip(1).ToArray();//course ID get
    dr.Close();
    con.Close();

    con.Open();
    temp = "";
    foreach (string crs in crsID)
    {
        sql = "SELECT G.grade AS grade, C.crsName AS crsName FROM gpaSem G, course C WHERE G.courseID=C.courseID AND G.courseID=@courseID";
        cmd.Parameters.AddWithValue("@courseID", crs);
        dr = cmd.ExecuteReader();
        if(dr.Read())
        {
            temp += "!" + dr["crsName"];//error
            temp02 += "!" + dr["grade"];
        }
    }
    crsName = temp.Split('!');
    crsName = crsName.Skip(1).ToArray();//course name get
    grade = temp02.Split('!');
    grade = grade.Skip(1).ToArray();//grade get
    dr.Close();
    con.Close();

我的意思是,我应该在 SQL 语句中显式使用 JOIN 还是访问值的方式错误?

标签: asp.netdatareader

解决方案


推荐阅读