簡體   English   中英

在C#中使用LINQ第二次獲取數據時出現異常

[英]Getting exception on retriving data for the second time using LINQ in c#

先生,我已經用linq填充了我的數據集

 public void FillDataSet(DataSet ds1,int Id)
   {
       try
       {
           var y = from ins in cstmrDC.customers_rd(Id) select ins;
           var z = from ins in cstmrDC.customersCntcts_rd(Id) select ins;

           DataTable dtCst = new DataTable("dtCstmr");
           dtCst.Columns.Add("cst_Id");
           dtCst.Columns.Add("cst_Name");
           dtCst.Columns.Add("cst_SName");
           dtCst.Columns.Add("cst_AdLn1");

           DataTable dtDtls = new DataTable("dtDtails");
           dtDtls.Columns.Add("cst_SrlNo");
           dtDtls.Columns.Add("cst_CntName");
           dtDtls.Columns.Add("cst_cntDsgn");


           foreach (var dtbl in y)
           {
               DataRow dr;
               dr = dtCst.NewRow();
               dr[0] = dtbl.cust_Id;
               dr[1] = dtbl.cust_Name;
               dr[2] = dtbl.cust_Sname;
               dr[3] = dtbl.cust_Adrsln1;
               dtCst.Rows.Add(dr);

           }
           foreach (var dtbl in z)
           {
               DataRow drDtls;
               drDtls = dtDtls.NewRow();
               drDtls[0] = dtbl.cust_Slno;
               drDtls[1] = dtbl.cust_Cntctnm;
               drDtls[2] = dtbl.cust_Cntctdesig;          
               dtDtls.Rows.Add(drDtls);
           }

           ds1.Tables.Add(dtCst);
           ds1.Tables.Add(dtDtls);

       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message);
       }
   }

而Id從另一個類傳遞過來

            intId = int.Parse(txtSearch.Text);
            cstCls.FillDataSet(ds1w, intId);

從該數據集iam fillimg我的文本框控制器,並將數據源作為dgvCustInfo.DataSource = ds1w.Tables["dtDtails"];提供給dataGridView

這樣,如果我第一次用整數ID 1055搜索,則意味着確切的結果來自數據庫。 同時,如果我給另一個整數Id作為1066 meance,則Iam異常,因為DataTable named 'dtCstmr' already belongs to this DataSet ..那么我怎么解決這個問題。

您可以使用Contains檢查表是否已包含在DataSet

if(!ds1.Tables.Contains(dtCst.TableName))
    ds1.Tables.Add(dtCst);
if(!ds1.Tables.Contains(dtDtls.TableName))
    ds1.Tables.Add(dtDtls);

但是,正如Raphael所提到的那樣,這不會刷新DataSet中的表。 因此,一種簡單的方法是刪除舊表並添加新表:

if(ds1.Tables.Contains(dtCst.TableName))
    ds1.Tables.Remove(dtCst.TableName);
if(ds1.Tables.Contains(dtDtls.TableName))
    ds1.Tables.Remove(dtDtls.TableName);
ds1.Tables.Add(dtCst);
ds1.Tables.Add(dtDtls);

用相同的方法創建和填充是一個非常糟糕的主意。

您的代碼確實令人困惑。

創建另一個方法:

public void CreateTables(DataSet ds1) {
  var dtCst = new DataTable("dtCstmr");
  dtCst.Columns.Add("cst_Id");
  dtCst.Columns.Add("cst_Name");
  dtCst.Columns.Add("cst_SName");
  dtCst.Columns.Add("cst_AdLn1");

  var dtDtls = new DataTable("dtDtails");
  dtDtls.Columns.Add("cst_SrlNo");
  dtDtls.Columns.Add("cst_CntName");
  dtDtls.Columns.Add("cst_cntDsgn");

  ds1.Tables.Add(dtCst);
  ds1.Tables.Add(dtDtls);
}

public void FillDataSet(DataSet ds1,int Id)
   {
       try
       {
           var y = from ins in cstmrDC.customers_rd(Id) select ins;
           var z = from ins in cstmrDC.customersCntcts_rd(Id) select ins;

           var dtCst = ds1.Tables["dtCstmr"];
           var dtDtls = ds1.Tables["dtDtails"];
           dtCst.Clear();
           dtDtls.Clear();


           foreach (var dtbl in y)
           {
               DataRow dr;
               dr = dtCst.NewRow();
               dr[0] = dtbl.cust_Id;
               dr[1] = dtbl.cust_Name;
               dr[2] = dtbl.cust_Sname;
               dr[3] = dtbl.cust_Adrsln1;
               dtCst.Rows.Add(dr);

           }
           foreach (var dtbl in z)
           {
               DataRow drDtls;
               drDtls = dtDtls.NewRow();
               drDtls[0] = dtbl.cust_Slno;
               drDtls[1] = dtbl.cust_Cntctnm;
               drDtls[2] = dtbl.cust_Cntctdesig;          
               dtDtls.Rows.Add(drDtls);
           }
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message);
       }
   }

方法CreateTables應該僅被調用一次,而FillDataSet根據需要被調用多次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM