asp.net 获取错误:读取器关闭时调用Read的尝试无效

bttbmeg0  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(149)

我在一个存储过程中有两个select语句,并在数据读取器中获取结果集。我的目标是将两个select语句中的数据合并到一个JSON字符串中。
我正在使用嵌套的do while,在while结束时,我收到一个错误
第一个月
下面是代码:

try
        {
            
                con.Open();
            
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "SPWorkMetaData";
            
            
            rd = cmd.ExecuteReader();
            
            List<Dictionary<String, Object>> tableRow = new List<Dictionary<string, object>>();
            List<Dictionary<String, Object>> tableRow1 = new List<Dictionary<string, object>>();
            Dictionary<String, Object> rows;
            
            if (rd.HasRows)
            {
                do 
                {
                    dt = new DataTable();
                    dt.Load(rd);

                    foreach (DataRow dr in dt.Rows)
                    {
                        rows = new Dictionary<string, object>();
                        int i = 1;
                        foreach (DataColumn col in dt.Columns)
                        {
                            rows.Add(col.ColumnName, dr[col].ToString());
                            i = i + 1;
                        }
                        tableRow.Add(rows);
                        status = "true";
                    }

                    retvalue = serializer.Serialize(tableRow).ToString();
                    //response = "{\"status\":\"" + status + "\",\"data\":" + retvalue + "}";
                    do
                    {
                        DataTable dt1 = new DataTable();
                        dt1.Load(rd);
                        foreach (DataRow dr in dt1.Rows)
                        {
                            Dictionary<String, Object> rows1 = new Dictionary<String, Object>();
                            int i = 1;
                            foreach (DataColumn col in dt1.Columns)
                            {
                                rows1.Add(col.ColumnName, dr[col].ToString());
                                i = i + 1;
                            }
                            tableRow1.Add(rows1);
                            status = "true";
                        }
                        retvalue = serializer.Serialize(tableRow).ToString() + serializer.Serialize(tableRow1).ToString();
                        response = "{\"status\":\"" + status + "\",\"data\":" + retvalue + "}";
                    }
                    while (rd.Read());
                }
                while (rd.NextResult()) ;
               
                
            }

        }

这个错误是否意味着SQL连接被关闭,如果是,那么它提到我只在finally块中关闭连接。
需要了解这一点,敬请提供一些指导。
谢谢。

qxsslcnc

qxsslcnc1#

那么,您没有注意到返回的两个表是否是相同的数据结构吗?
这就引出了一个问题:为什么不使用联合查询?
我也不认为(怀疑)你想序列化一个数据行,因为一个数据行有“额外”的东西,如行脏了(被更改)和相当多的“额外”属性,我怀疑你想成为客户端的json结果的一部分。
因此,让我们提取这两个表(并忽略为什么这里不使用联合查询!!!)。
但是,假设我有两个表:tblHotels和People --它们都有FirstName、lastname列。
因此,从理论上讲,如果我们要得到一个“合理的”JSON字符串,就需要一个干净的数据结构。
因此,我建议使用以下代码:

class PersonName
    {
        public string FirstName = "";
        public string LastName = "";
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand("Test2", conn))
            {
                SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
                conn.Open();
                DataSet1 ds = new DataSet1();
                da.Fill(ds);

                List<PersonName> MyNames = new List<PersonName>();

                // merge records form both tables (FirstName, LastName) into list
                foreach (DataRow OneRow in ds.Tables[0].Rows)
                {
                    PersonName OneName = new PersonName();
                    OneName.FirstName = OneRow["FirstName"].ToString();
                    OneName.LastName = OneRow["LastName"].ToString();
                    MyNames.Add(OneName);
                }

                // now merge 2nd table
                foreach (DataRow OneRow in ds.Tables[1].Rows)
                {
                    PersonName OneName = new PersonName();
                    OneName.FirstName = OneRow["FirstName"].ToString();
                    OneName.LastName = OneRow["LastName"].ToString();
                    MyNames.Add(OneName);
                }

                // at this point, we now have a merge of both tables
                JavaScriptSerializer js = new JavaScriptSerializer();

                string MyJSON = js.Serialize(MyNames);
            }
        }

    }

相关问题