在 c# 中使用 LINQ 第二次检索数据时出现异常



先生,我已经用 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);

从该数据集填充我的文本框控制器,并将数据源提供给数据网格视图 dgvCustInfo.DataSource = ds1w.Tables["dtDtails"];

这样,如果我第一次使用整数 id 1055 进行搜索,则意味着确切的结果来自数据库。同时,如果我将另一个整数 Id 作为 1066 表示我得到异常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 所提到的,这不会刷新数据集中的表。因此,一个简单的方法是删除旧表并添加新表:

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多次。

相关内容

  • 没有找到相关文章

最新更新