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 として指定すると、DataTable named 'dtCstmr' already belongs to this DataSet..どうすれば問題を解決できますか。

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は 1 回だけFillDataSet、必要に応じて何度でも呼び出す必要があります。

于 2013-01-23T09:46:55.190 に答える