web-dev-qa-db-ja.com

DataTableに行が存在するかどうかを確認しますか?

データテーブルと行があります。行がデータテーブルに存在しない場合にのみ、データテーブルに行をインポートします。

どうやってやるの?

8
Curious

入力されたDataSetを使用する場合、つまり設計時に宣言された「linq Containsメソッド」は、型付きのDataRowを取ります。デフォルトのIEqualityComparerは、DataRowのすべての値を比較します。 (これは、キーを定義する必要があるため、通常は役に立ちません)。

DataSet1 ds = new DataSet1();
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla);
bool exists = ds.DataTable1.Contains(row);
10
S22

cells内のすべてのDataRowをチェックする場合は、次の関数を試すことができます。

bool ContainDataRowInDataTable(DataTable T,DataRow R)
{
    foreach (DataRow item in T.Rows)
    {
        if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray))
            return true;
    }
    return false;
}
7
Mehdi Khademloo

LINQを使用して、行がデータテーブルに存在するかどうかを確認できます。このソリューションに従い、 "id"を行の主キーに置き換えます。これにより、テーブル内の行を一意に識別できます。

DataRow dr = null; // assign your DR here
DataTable dt = new DataTable(); // assign Datatable instance here.
var k = (from r in dt.Rows.OfType<DataRow>()  where r["id"].ToString() == dr["id"].ToString() select r).FirstOrDefault();
if(k != null)
{  // Row is present }
6
Arindam Nayak

以下のようにContainsを使用できます

if(DataTable.Columns.Contains("RowName"))
{
  //Do some stuffs here
}
3
Vijay Kumbhoje

ここですべての答えを試してみましたが、うまくいきませんでした。コードは非常に単純です。追加する行がデータテーブルにすでに存在するかどうかを確認します。データテーブルに存在しない場合は追加します。

// fill dt with information
DataTable dt = new DataTable();

// create a new row and fill it with information
DataRow dr = dt.NewRow();

// distinct
bool isDistinct = true;
for (int i=0; i < dt.Rows.Count; i++)
{
  // check if both rows are equal
  if (Enumerable.SequenceEqual(dt.Rows[i].ItemArray, dr.ItemArray))
  {
    // it already exists
    isDistinct = false;
    break;
  }
}

if (isDistinct)
{
  dt.Rows.Add(dr);
}
2
xlimit91
if ( Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted")
0
FahimFatehi

主キーを比較して、行の存在を確認する必要があります。

_static bool RowExists(DataTable table, DataRow row)
{
    var pk = table.PrimaryKey
                .Select(column => row[column, DataRowVersion.Original])
                .ToArray();

    return table.Rows.Contains(pk);
}
_

理由は、既存のDataRowに対してチェックしようとしているDataTableが、実際のシナリオでは、同じでも、テーブル内のDataRawとは異なるクラスインスタンスであることです。 DataRawはすでにDataTableに存在します。通常の.NETの等価比較は、このシナリオでは適切に機能しません。これにはDataTable.Contains(...)メソッドが含まれます。

テーブル内のDataRawの存在を適切に確認するには、DataRawが指定された主キーをテーブル内で検索する必要があります。

0
Nenad