По сути, я вижу три основные вещи ...
Один
Вам не нужно *
в запросе. DELETE
влияет на всю строку, поэтому нет необходимости указывать столбцы. Просто что-то вроде:
DELETE FROM SomeTable WHERE SomeColumn = 123
Два
Здесь нет необходимости в SqlDataAdapter
, все, что вам нужно сделать, это выполнить запрос . Например:
cmd.ExecuteNonQuery();
"non query" - это, по сути, команда SQL, которая не запрашивает данные для результатов. Вставки, обновления и удаления, как правило, не являются запросами в этом контексте. То, что он вернул бы, это просто число затронутых строк, которое вы можете использовать, чтобы дважды проверить, что оно соответствует ожидаемому при необходимости.
Три
Не делайте этого :
cmd.CommandText = "Delete From Members where MemberId = " + _memberId;
Этот тип конкатенации строк приводит к SQL инъекции . Интуитивно это выглядит так, будто вы используете _memberId
в качестве значения запроса, но технически вы используете его в качестве исполняемого кода . Менее вероятно (хотя и не невозможно) быть проблемой для числовых значений c, но это огромная проблема для строковых значений, поскольку это означает, что пользователь может отправить вам любую строку , и вы выполните его как код .
Вместо этого используйте параметры запроса . Например, вы можете сделать что-то вроде этого:
cmd.CommandText = "Delete From Members where MemberId = @memberId";
cmd.Parameters.Add("@memberId", SqlDbType.Int);
cmd.Parameters["@memberId"].Value = _memberId;
Это говорит самому механизму базы данных, что значение является значением, а не частью выполняющегося запроса, и механизм базы данных знает, как безопасно обрабатывать значения.