web-dev-qa-db-fra.com

Vérifiez si la ligne existe dans DataTable?

J'ai un datatable et une rangée. Je souhaite importer la ligne dans la table de données uniquement si elle n'existe pas dans la table de données.

Comment puis je faire ça?

8
Curious

Si vous utilisez un DataSet, c'est-à-dire déclarée au moment du design, la "méthode linq Contains" prend un DataRow typé. La valeur par défaut IEqualityComparer comparera toutes les valeurs de DataRow. (Ce qui est normalement inutile, car vous devriez avoir une clé définie).

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

si vous voulez vérifier tous les cells dans un DataRow, vous pouvez essayer cette fonction:

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

Vous pouvez utiliser LINQ pour vérifier si la ligne est présente dans la table de données. Suivez cette solution et remplacez "id" par la clé primaire de votre ligne, par laquelle vous pouvez identifier de manière unique une ligne dans une table.

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

vous pouvez utiliser Contains comme ci-dessous

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

J'ai essayé toutes les réponses ici mais n'a pas fonctionné, alors j'ai fait quelque chose pour moi qui fonctionne dans mon cas. Le code est assez simple, il vérifie si la ligne que vous souhaitez ajouter existe déjà dans la table de données - si elle n'existe pas dans la table de données, ajoutez-la.

// 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

Vous devez vérifier l'existence de lignes en comparant les clés primaires:

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

    return table.Rows.Contains(pk);
}

La raison en est que DataRow que vous essayez de vérifier par rapport à DataTable est, dans des scénarios réels, une instance de classe différente par rapport à DataRaw dans le tableau, même lorsqu'elle est identique DataRaw existe déjà dans le DataTable. La comparaison d'égalité .NET habituelle ne fonctionne pas correctement dans ces scénarios. Cela inclut la méthode DataTable.Contains(...).

Pour vérifier correctement l'existence de DataRaw dans la table, la clé primaire donnée DataRaw doit être recherchée dans la table.

0
Nenad