DataTable найти или, если не найден, вставить строку - PullRequest
1 голос
/ 30 ноября 2011

У меня есть DataTable dt с 2 столбцами.Первый col (назовите его CustomerId) является уникальным и не допускает нулевые значения.второй допускает пустые значения и не является уникальным.

Из метода я получаю CustomerId, а затем я хотел бы либо вставить новую запись, если этот CustomerId не существует, либо увеличить на 1, что во втором столбцесоответствующий этому CustomerId, если он существует.

Я не уверен, как мне подходить к этому.Я написал оператор выбора (который возвращает System.Data.DataRow), но я не знаю, как проверить, вернула ли он пустую строку.

В настоящее время у меня есть:

//I want to insert a new row
if (dt.Select("CustomerId ='" + customerId + "'") == null) //Always true :|
    {
        DataRow dr = dt.NewRow();
        dr["CustomerId"] = customerId; 
    }

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Если таблица данных заполняется базой данных.Я бы порекомендовал сделать так, чтобы столбец идентификации был идентифицирован.Таким образом, когда вы добавляете новую строку, она автоматически создает новую переменную привязки, которая будет уникальной и на 1 больше, чем предыдущий идентификатор (в зависимости от того, как вы настроили свой столбец идентификаторов)вернулся из оператора выбора.Что-то вроде

Я бы тоже использовал string.Format ...

Так бы это выглядело

var selectStatement = string.Format("CustomerId = {0}", customerId);
var rows = dt.Select(selectStatement);
if (rows.Count < 1){
  var dr = dt.NewRow();
  dr["CustomerId"] = customerId; 
}
0 голосов
/ 26 ноября 2014

Это мой метод решения аналогичной проблемы. Вы можете изменить его под свои нужды.

public static bool ImportRowIfNotExists(DataTable dataTable, DataRow dataRow, string keyColumnName)
{
    string selectStatement = string.Format("{0} = '{1}'", keyColumnName, dataRow[keyColumnName]);
    DataRow[] rows = dataTable.Select(selectStatement);
    if (rows.Length == 0)
    {
        dataTable.ImportRow(dataRow);
        return true;
    }
    else
    {
        return false;
    }
}
0 голосов
/ 30 ноября 2011

Метод Select возвращает массив объектов DataRow. Просто проверьте, равна ли его длина нулю (никогда null).

Кстати, не пишите такие выражения в коде напрямую, как в этом примере. Существует методика нарушения безопасности вашего кода, называемая «SQL-инъекция», я рекомендую вам прочитать статью Википедии . Короче говоря, опытный пользователь может написать сценарий SQL, который будет выполняться вашей базой данных, и потенциально может совершать вредоносные действия, если вы берете customerId от пользователя в виде строки. У меня нет опыта в программировании баз данных, это просто "общие знания" ...

...