0

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

从该数据集我填写我的文本框控制器并将 theDataSource 提供给 dataGridView 作为 dgvCustInfo.DataSource = ds1w.Tables["dtDtails"];

这样,如果我第一次使用整数 id 1055 进行搜索,则意味着确切的结果来自数据库。同时,如果我将另一个整数 ID 设为 1066,则意味着 Iam 将异常为DataTable named 'dtCstmr' already belongs to this DataSet.. Soo 我该如何解决这个问题。

4

2 回答 2

1

您可以检查表是否已包含在DataSetwith 中Contains

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);
于 2013-01-23T09:31:20.117 回答
0

以相同的方法创建和填充是一个非常糟糕的主意。

你的代码真的很混乱。

创建另一个方法:

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可以根据需要多次调用。

于 2013-01-23T09:46:55.190 回答