【问题标题】:How to store results returned from SqlDataReader?如何存储从 SqlDataReader 返回的结果?
【发布时间】:2023-03-31 07:00:01
【问题描述】:

我是一个菜鸟,正如我的问题所证明的那样,我正在使用数据读取器来查找与某个 subId 值关联的行。我使用了一个 while(dr.read) 循环,并在每种情况下都将一个 switch case 语句与其他读取器嵌套(下面的代码),但我抛出了异常“已经是与此命令关联的开放数据读取器,必须首先关闭”。有没有办法将第一个数据读取器的结果(subId = x 的相关行)存储在数组或列表中,然后在我输入 switch 语句之前关闭该读取器? (我理解数组是什么,我认为它会起作用,但我不知道语法是什么样的)。

string viewQuery = "SELECT ProductId FROM SubmissionProducts WHERE SubmissionId =" + x;



            using (SqlCommand viewcmd = new SqlCommand(viewQuery, editConn))
            {
                SqlDataReader dr = viewcmd.ExecuteReader();
                while (dr.Read())
                {
                    switch(dr.GetInt32(0))
                    {
                        case 1:
                            PanelEplShow.Visible = true;
                            using (SqlCommand eplviewcmd = new SqlCommand(epl, editConn))
                            {
                                SqlDataReader epldr = eplviewcmd.ExecuteReader();
                                epldr.Read();
                                LblEplShowEntity.Text = epldr.GetString(0);
                                LblEplShowTotalEmpl.Text = epldr.GetInt32(1).ToString();
                                LblEplShowCalEmpl.Text = epldr.GetInt32(2).ToString();
                                LblEplShowMichEmpl.Text = epldr.GetInt32(3).ToString();
                                LblEplShowNyEmpl.Text = epldr.GetInt32(4).ToString();
                                LblEplShowNjEmpl.Text = epldr.GetInt32(5).ToString();
                                LblEplShowPrimEx.Text = epldr.GetInt32(6).ToString();
                                LblEplShowLim.Text = epldr.GetInt32(7).ToString();
                                LblEplShowPrem.Text = epldr.GetInt32(8).ToString();
                                LblEplShowWage.Text = epldr.GetInt32(9).ToString();
                                LblEplShowInvestCost.Text = epldr.GetInt32(10).ToString();
                                epldr.Close();
                            }
                            break;
                        case 2:
                            PanelProfShow.Visible = true;
                            using (SqlCommand profcmd1 = new SqlCommand(prof, editConn))
                            {
                                SqlDataReader profdr = profcmd1.ExecuteReader();
                                profdr.Read();
                                LblProfShowPrimEx.Text = profdr.GetInt32(0).ToString();
                                LblProfShowType.Text = profdr.GetInt32(1).ToString();
                                LblProfShowLim.Text = profdr.GetInt32(2).ToString();
                                LblProfShowRetention.Text = profdr.GetInt32(3).ToString();
                                LblProfShowAtt.Text = profdr.GetInt32(4).ToString();
                                LblProfShowPrem.Text = profdr.GetInt32(5).ToString();
                                LblProfShowSublim.Text = profdr.GetInt32(5).ToString();
                                LblProfShowEntity.Text = profdr.GetInt32(6).ToString();
                                profdr.Close();
                            }
                            break;
                        case 3:
                            PanelCrimeShow.Visible = true;
                            using (SqlCommand crimcmd = new SqlCommand(crim, editConn))
                            {
                                SqlDataReader crimdr = crimcmd.ExecuteReader();
                                crimdr.Read();
                                LblCrimeShowEntity.Text = crimdr.GetString(0);
                                LblCrimeShowEmpl.Text = crimdr.GetInt32(1).ToString();
                                LblCrimeShowPrimEx.Text = crimdr.GetInt32(2).ToString();
                                LblCrimeShowLimA.Text = crimdr.GetInt32(3).ToString();
                                LblCrimeShowDedA.Text = crimdr.GetInt32(4).ToString();
                                LblCrimeShowPremA.Text = crimdr.GetInt32(5).ToString();
                                LblCrimeShowLimB.Text = crimdr.GetInt32(6).ToString();
                                LblCrimeShowDedB.Text = crimdr.GetInt32(7).ToString();
                                LblCrimeShowPremB.Text = crimdr.GetInt32(8).ToString();
                                crimdr.Close();
                            }
                            break;
                        case 4:
                            PanelFidShow.Visible = true;
                            using (SqlCommand fidcmd = new SqlCommand(fid, editConn))
                            {
                                SqlDataReader fiddr = fidcmd.ExecuteReader();
                                fiddr.Read();
                                LblFidShowEntity.Text = fiddr.GetString(0);
                                LblFidShowPrimEx.Text = fiddr.GetInt32(1).ToString();
                                LblFidShowLim.Text = fiddr.GetInt32(2).ToString();
                                LblFidShowSir.Text = fiddr.GetInt32(3).ToString();
                                LblFidShowAtt.Text = fiddr.GetInt32(4).ToString();
                                LblFidShowPrem.Text = fiddr.GetInt32(5).ToString();
                                LblFidShowSublim.Text = fiddr.GetInt32(6).ToString();
                                fiddr.Close();
                            }
                            break;
                        case 5:
                            PanelNotShow.Visible = true;
                            using (SqlCommand notcmd = new SqlCommand(not, editConn))
                            {
                                SqlDataReader notdr = notcmd.ExecuteReader();
                                notdr.Read();
                                LblNotShowPrimEx.Text = notdr.GetInt32(0).ToString();
                                LblNotShowCov.Text = notdr.GetInt32(1).ToString();
                                LblNotShowSharedLim.Text = notdr.GetInt32(2).ToString();
                                LblNotShowTradLim.Text = notdr.GetInt32(3).ToString();
                                LblNotShowTradSir.Text = notdr.GetInt32(4).ToString();
                                LblNotShowEplLim.Text = notdr.GetInt32(5).ToString();
                                LblNotShowEplSir.Text = notdr.GetInt32(6).ToString();
                                LblNotShowEplPrem.Text = notdr.GetInt32(7).ToString();
                                LblNotShowSublim.Text = notdr.GetInt32(8).ToString();
                                notdr.Close();
                            }
                            break;
                        case 6:
                            PanelPrivShow.Visible = true;
                            using (SqlCommand privcmd = new SqlCommand(priv, editConn))
                            {
                                SqlDataReader privdr = privcmd.ExecuteReader();
                                privdr.Read();
                                LblPrivShowPrimEx.Text = privdr.GetInt32(0).ToString();
                                LblPrivShowSharedLim.Text = privdr.GetInt32(1).ToString();
                                LblPrivShowTradLim.Text = privdr.GetInt32(2).ToString();
                                LblPrivShowTradAtt.Text = privdr.GetInt32(3).ToString();
                                LblPrivShowTradSir.Text = privdr.GetInt32(4).ToString();
                                LblPrivShowTradPrem.Text = privdr.GetInt32(5).ToString();
                                LblPrivShowEplLim.Text = privdr.GetInt32(6).ToString();
                                LblPrivShowEplSir.Text = privdr.GetInt32(7).ToString();
                                LblPrivShowEplAtt.Text = privdr.GetInt32(8).ToString();
                                LblPrivShowEplPrem.Text = privdr.GetInt32(9).ToString();
                                LblPrivShowEplWage.Text = privdr.GetInt32(10).ToString();
                                LblPrivShowEplSublim.Text = privdr.GetInt32(11).ToString();
                                LblPrivShowFidLim.Text = privdr.GetInt32(12).ToString();
                                LblPrivShowFidSir.Text = privdr.GetInt32(13).ToString();
                                LblPrivShowFidAtt.Text = privdr.GetInt32(14).ToString();
                                LblPrivShowFidPrem.Text = privdr.GetInt32(15).ToString();
                                LblPrivShowFidSublim.Text = privdr.GetInt32(16).ToString();
                                privdr.Close();
                            }
                            break;
                        case 7:
                            PanelPubShow.Visible = true;
                            using (SqlCommand pubcmd = new SqlCommand(pub, editConn))
                            {
                                SqlDataReader pubdr = pubcmd.ExecuteReader();
                                pubdr.Read();
                                LblPubShowMark.Text = pubdr.GetInt32(0).ToString();
                                LblPubShowTick.Text = pubdr.GetInt32(1).ToString();
                                LblPubShowTrad.Text = pubdr.GetInt32(2).ToString();
                                LblPubShowDic.Text = pubdr.GetInt32(3).ToString();
                                LblPubShowLim.Text = pubdr.GetInt32(4).ToString();
                                LblPubShowSecSir.Text = pubdr.GetInt32(5).ToString();
                                LblPubShowAllSir.Text = pubdr.GetInt32(6).ToString();
                                LblPubShowPrem.Text = pubdr.GetInt32(7).ToString();
                                LblPubShowPrimEx.Text = pubdr.GetInt32(8).ToString();
                                LblPubShowAtt.Text = pubdr.GetInt32(9).ToString();
                                LblPubShowSublim.Text = pubdr.GetInt32(10).ToString();
                                pubdr.Close();
                            }
                            break;
                        default:
                            break;
                    }
                }
                dr.Close();`

【问题讨论】:

    标签: c# asp.net sql-server visual-studio


    【解决方案1】:

    将其加载到DataTable

    SqlDataReader pubdr = pubcmd.ExecuteReader();
    DataTable dt = new DataTable();
    dt.Load(pubdr);
    

    扩展 cmets:

    foreach (DataRow dr in dt.Rows)
    {
        LblEplShowEntity.Text = dr["FIELDNAME"].ToString();
        //...
    }
    

    【讨论】:

    • dt.Rows[rowindex][columnName/columnIndex]
    【解决方案2】:

    加载一个DataTable,无论如何它在内部都是一个持久化的DataReader

    对于您消费、使用、丢弃的 DataReader。这就是 DataReader 的本质。如果您希望数据保留,您将使用 DataTable。简单,但经验法则很好。

    【讨论】:

      【解决方案3】:

      假设 SubmissionId 在表 SubmissionProducts 中是唯一的,则您无需使用数据读取器进行查询。您可以改用命令对象的ExecuteScalar 方法。

      如果您想从 DataReader 获取当前行中所有列值的数组,您可以使用 GetValues 方法,如下所示:

          SqlDataReader reader; // assumming the data reader is already opened 
          object[] columns = new object[reader.FieldCount];
          reader.GetValues(columns);// columns now contains all the values from the curent row
      

      【讨论】:

      • 很遗憾,不,SubmissionId 可以关联多个实例。
      【解决方案4】:

      我发现我必须调整连接字符串中的某些内容。我不知道这是否是 .Net 故障,或者是否只是使用嵌套阅读器时的必要调整,但我必须将 MultipleActiveResultSets="true" 添加到我存储的连接字符串中。之后,一切正常,不需要数据表。非常感谢所有回答的人。虽然我确信上面的答案也可能有效,但如果这个问题对将来的某个人有用,我会发布完整的代码来展示什么对我有用。 请注意:如果您是编码新手,需要这篇文章,请将您的查询参数化。这个网站是一个培训项目,我被指示避免参数化,以便首先学习其他东西,但这是最重要的。鲍比桌ftw。

      这是代码。

      using System;
      using System.Text;
      using System.Collections.Generic;
      using System.Linq;
      using System.Data;
      using System.Data.Sql;
      using System.Data.SqlClient;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      
      public partial class View : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
      
              string x = Request.QueryString["SubmissionId"];
              string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
              string editCustQuery = "SELECT CustName, SicNaic, CustCity, CustAdd, CustState, CustZip FROM Customer WHERE SubId =" + x;
              string editBroQuery = "SELECT BroName, BroAdd, BroCity, BroState, BroZip, EntityType FROM Broker WHERE SubId =" + x; 
              string editSubQuery = "SELECT Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments FROM Submission WHERE SubmissionId =" + x;
              string epl = "SELECT Entity, Employees, CA, MI, NY, NJ, Primex, EplLim, EplSir, Premium, Wage, Sublim FROM EPL WHERE SubmissionId =" + x;
              string prof = "SELECT Primex, EO, Limit, Retention, Att, Prem, Sublim, Entity FROM ProfessionalEO WHERE SubmissionId =" + x;
              string crim = "SELECT Entity, Employees, PrimEx, LimA, DedA, PremA, LimitB, DedB, PremB FROM CrimeFidelity WHERE SubmissionId =" + x;
              string fid = "SELECT Entity, PrimEx, Limit, SIR, Att, Premium, Sublim FROM Fiduciary WHERE SubmissionId =" + x;
              string not = "SELECT PrimEx, Coverage, SharedSepLim, TradLim, TradDoSir, EplLim, EplSir, EplPrem, EplSublim FROM NotProfit WHERE SubmissionId =" + x;
              string priv = "SELECT Primex, SharedSepLim, TradLim, TradAtt, TradDoSir, TradPrem, EplLim, EplSir, EplAtt, EplWage, EplPrem, EplInvest, FidLim, FidSir, FidAtt, FidPrem, FidSublim FROM PrivateCompany WHERE SubmissionId =" + x;
              string pub = "SELECT Market, Ticker, TradABC, DIC, Limit, SecuritiesSir, OtherSir, Premium, PrimEx, Att, Sublim FROM PublicDO WHERE SubmissionId =" + x;
              using (SqlConnection editConn = new SqlConnection(connectionString))
              {
                  editConn.Open();
      
                  using (SqlCommand CustCommand = new SqlCommand(editCustQuery, editConn))
                  {
      
                      SqlDataReader dr = CustCommand.ExecuteReader();
                      dr.Read();
                      LblCustName.Text = dr.GetString(0);
                      LblSicNaic.Text = dr.GetString(1);
                      LblCustCity.Text = dr.GetString(2);
                      LblCustAddress.Text = dr.GetString(3);
                      LblCustState.Text = dr.GetString(4);
                      LblCustZip.Text = dr.GetInt32(5).ToString();
                      dr.Close();
                  }
                  using (SqlCommand BroCommand = new SqlCommand(editBroQuery, editConn))
                  {
                      SqlDataReader dr = BroCommand.ExecuteReader();
                      dr.Read();
                      LblBroName.Text = dr.GetString(0);
                      LblBroAddress.Text = dr.GetString(1);
                      LblBroCity.Text = dr.GetString(2);
                      LblBroState.Text = dr.GetString(3);
                      LblBroZip.Text = dr.GetInt32(4).ToString();
                      LblEntity.Text = dr.GetString(5);
                      dr.Close();
                  }
                  using (SqlCommand SubCommand = new SqlCommand(editSubQuery, editConn))
                  {
                      SqlDataReader dr = SubCommand.ExecuteReader();
                      dr.Read();
                      LblCoverage.Text = dr.GetInt32(0).ToString();
                      LblCurrentCoverage.Text = dr.GetInt32(1).ToString();
                      LblPrimEx.Text = dr.GetInt32(2).ToString();
                      LblRetention.Text = dr.GetInt32(3).ToString();
                      LblEffectDate.Text = dr.GetDateTime(4).ToString();
                      LblCommission.Text = dr.GetInt32(5).ToString();
                      LblPremium.Text = dr.GetInt32(6).ToString();
                      LblComments.Text = dr.GetString(7);
                      dr.Close();
                      HyperLink1.NavigateUrl = "~/ViewEdit.aspx?SubmissionId=" + x;
                  }
                      string viewQuery = "SELECT ProductId FROM SubmissionProducts WHERE SubmissionId =" + x;
      
                      SqlCommand viewcmd = new SqlCommand(viewQuery, editConn);
      
                      SqlDataReader drRows = viewcmd.ExecuteReader();
                      while (drRows.Read())
                          {
                              switch (drRows.GetInt32(0))
                              {
                                  case 1:
                                      PanelEplShow.Visible = true;
                                      using (SqlCommand eplviewcmd = new SqlCommand(epl, editConn))
                                      {
                                          SqlDataReader epldr = eplviewcmd.ExecuteReader();
                                          epldr.Read();
                                          LblEplShowEntity.Text = epldr.GetString(0);
                                          LblEplShowTotalEmpl.Text = epldr.GetInt32(1).ToString();
                                          LblEplShowCalEmpl.Text = epldr.GetInt32(2).ToString();
                                          LblEplShowMichEmpl.Text = epldr.GetInt32(3).ToString();
                                          LblEplShowNyEmpl.Text = epldr.GetInt32(4).ToString();
                                          LblEplShowNjEmpl.Text = epldr.GetInt32(5).ToString();
                                          LblEplShowPrimEx.Text = epldr.GetInt32(6).ToString();
                                          LblEplShowLim.Text = epldr.GetInt32(7).ToString();
                                          LblEplShowSir.Text = epldr.GetInt32(8).ToString();
                                          LblEplShowPrem.Text = epldr.GetInt32(9).ToString();
                                          LblEplShowWage.Text = epldr.GetInt32(10).ToString();
                                          LblEplShowInvestCost.Text = epldr.GetInt32(11).ToString();
                                          epldr.Close();
                                      }
                                      break;
                                  case 2:
                                      PanelProfShow.Visible = true;
                                      using (SqlCommand profcmd = new SqlCommand(prof, editConn))
                                      {
                                          SqlDataReader profdr = profcmd.ExecuteReader();
                                          profdr.Read();
                                          LblProfShowPrimEx.Text = profdr.GetInt32(0).ToString();
                                          LblProfShowType.Text = profdr.GetString(1);
                                          LblProfShowLim.Text = profdr.GetInt32(2).ToString();
                                          LblProfShowRetention.Text = profdr.GetInt32(3).ToString();
                                          LblProfShowAtt.Text = profdr.GetInt32(4).ToString();
                                          LblProfShowPrem.Text = profdr.GetInt32(5).ToString();
                                          LblProfShowSublim.Text = profdr.GetInt32(6).ToString();
                                          LblProfShowEntity.Text = profdr.GetString(7);
                                          profdr.Close();
                                      }
                                      break;
                                  case 3:
                                      PanelCrimeShow.Visible = true;
                                      using (SqlCommand crimcmd = new SqlCommand(crim, editConn))
                                      {
                                          SqlDataReader crimdr = crimcmd.ExecuteReader();
                                          crimdr.Read();
                                          LblCrimeShowEntity.Text = crimdr.GetString(0);
                                          LblCrimeShowEmpl.Text = crimdr.GetInt32(1).ToString();
                                          LblCrimeShowPrimEx.Text = crimdr.GetInt32(2).ToString();
                                          LblCrimeShowLimA.Text = crimdr.GetInt32(3).ToString();
                                          LblCrimeShowDedA.Text = crimdr.GetInt32(4).ToString();
                                          LblCrimeShowPremA.Text = crimdr.GetInt32(5).ToString();
                                          LblCrimeShowLimB.Text = crimdr.GetInt32(6).ToString();
                                          LblCrimeShowDedB.Text = crimdr.GetInt32(7).ToString();
                                          LblCrimeShowPremB.Text = crimdr.GetInt32(8).ToString();
                                          crimdr.Close();
                                      }
                                      break;
                                  case 4:
                                      PanelFidShow.Visible = true;
                                      using (SqlCommand fidcmd = new SqlCommand(fid, editConn))
                                      {
                                          SqlDataReader fiddr = fidcmd.ExecuteReader();
                                          fiddr.Read();
                                          LblFidShowEntity.Text = fiddr.GetString(0);
                                          LblFidShowPrimEx.Text = fiddr.GetInt32(1).ToString();
                                          LblFidShowLim.Text = fiddr.GetInt32(2).ToString();
                                          LblFidShowSir.Text = fiddr.GetInt32(3).ToString();
                                          LblFidShowAtt.Text = fiddr.GetInt32(4).ToString();
                                          LblFidShowPrem.Text = fiddr.GetInt32(5).ToString();
                                          LblFidShowSublim.Text = fiddr.GetInt32(6).ToString();
                                          fiddr.Close();
                                      }
                                      break;
                                  case 5:
                                      PanelNotShow.Visible = true;
                                      using (SqlCommand notcmd = new SqlCommand(not, editConn))
                                      {
                                          SqlDataReader notdr = notcmd.ExecuteReader();
                                          notdr.Read();
                                          LblNotShowPrimEx.Text = notdr.GetInt32(0).ToString();
                                          LblNotShowCov.Text = notdr.GetInt32(1).ToString();
                                          LblNotShowSharedLim.Text = notdr.GetInt32(2).ToString();
                                          LblNotShowTradLim.Text = notdr.GetInt32(3).ToString();
                                          LblNotShowTradSir.Text = notdr.GetInt32(4).ToString();
                                          LblNotShowEplLim.Text = notdr.GetInt32(5).ToString();
                                          LblNotShowEplSir.Text = notdr.GetInt32(6).ToString();
                                          LblNotShowEplPrem.Text = notdr.GetInt32(7).ToString();
                                          LblNotShowSublim.Text = notdr.GetInt32(8).ToString();
                                          notdr.Close();
                                      }
                                      break;
                                  case 6:
                                      PanelPrivShow.Visible = true;
                                      using (SqlCommand privcmd = new SqlCommand(priv, editConn))
                                      {
                                          SqlDataReader privdr = privcmd.ExecuteReader();
                                          privdr.Read();
                                          LblPrivShowPrimEx.Text = privdr.GetInt32(0).ToString();
                                          LblPrivShowSharedLim.Text = privdr.GetInt32(1).ToString();
                                          LblPrivShowTradLim.Text = privdr.GetInt32(2).ToString();
                                          LblPrivShowTradAtt.Text = privdr.GetInt32(3).ToString();
                                          LblPrivShowTradSir.Text = privdr.GetInt32(4).ToString();
                                          LblPrivShowTradPrem.Text = privdr.GetInt32(5).ToString();
                                          LblPrivShowEplLim.Text = privdr.GetInt32(6).ToString();
                                          LblPrivShowEplSir.Text = privdr.GetInt32(7).ToString();
                                          LblPrivShowEplAtt.Text = privdr.GetInt32(8).ToString();
                                          LblPrivShowEplPrem.Text = privdr.GetInt32(9).ToString();
                                          LblPrivShowEplWage.Text = privdr.GetInt32(10).ToString();
                                          LblPrivShowEplSublim.Text = privdr.GetInt32(11).ToString();
                                          LblPrivShowFidLim.Text = privdr.GetInt32(12).ToString();
                                          LblPrivShowFidSir.Text = privdr.GetInt32(13).ToString();
                                          LblPrivShowFidAtt.Text = privdr.GetInt32(14).ToString();
                                          LblPrivShowFidPrem.Text = privdr.GetInt32(15).ToString();
                                          LblPrivShowFidSublim.Text = privdr.GetInt32(16).ToString();
                                          privdr.Close();
                                      }
                                      break;
                                  case 7:
                                      PanelPubShow.Visible = true;
                                      using (SqlCommand pubcmd = new SqlCommand(pub, editConn))
                                      {
                                          SqlDataReader pubdr = pubcmd.ExecuteReader();
                                          pubdr.Read();
                                          LblPubShowMark.Text = pubdr.GetInt32(0).ToString();
                                          LblPubShowTick.Text = pubdr.GetInt32(1).ToString();
                                          LblPubShowTrad.Text = pubdr.GetInt32(2).ToString();
                                          LblPubShowDic.Text = pubdr.GetString(3);
                                          LblPubShowLim.Text = pubdr.GetInt32(4).ToString();
                                          LblPubShowSecSir.Text = pubdr.GetInt32(5).ToString();
                                          LblPubShowAllSir.Text = pubdr.GetInt32(6).ToString();
                                          LblPubShowPrem.Text = pubdr.GetInt32(7).ToString();
                                          LblPubShowPrimEx.Text = pubdr.GetInt32(8).ToString();
                                          LblPubShowAtt.Text = pubdr.GetInt32(9).ToString();
                                          LblPubShowSublim.Text = pubdr.GetInt32(10).ToString();
                                          pubdr.Close();
                                      }
                                      break;
                                  default:
                                      break;
                              }
                          }
                      drRows.Close();
      
              }        
          }   
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-21
        • 1970-01-01
        • 2018-05-20
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多