Как удалить всю строку из базы данных - PullRequest
0 голосов
/ 23 января 2020

Как бы я удалил строку из базы данных sql, либо с хранимыми процедурами, либо без, сейчас я пробовал без использования нажатия кнопки. Это то, что у меня есть, _memberid был отправлен из другой формы из базы данных (для контекста).

private void btnDelete_Click(object sender, EventArgs e)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Lib.SqlConnection;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "Delete * From Members where MemberId = " + _memberId;
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.DeleteCommand = cmd;
        adapter.Fill(MembersDataTable); // Im fairly sure this is incorrect but i used it from old code
        DialogResult = DialogResult.OK;
    }

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Если вы пытаетесь сделать простое удаление на основе ADO. Net, то это будет что-то вроде его:

private void DeleteById(int memberId)
{
   // or pull the connString from config somewhere
   const string connectionString = "[your connection string]";

   using (var connection = new SqlConnection(connectionString))
   {
       connection.Open();

       using (var command = new SqlCommand("DELETE FROM Members WHERE MemberId = @memberId", connection))
       {
           command.Parameters.AddWithValue("@memberId", memberId);
           command.ExecuteNonQuery();
       }
   }

Используйте параметр для предотвращения SQL инъекции.

2 голосов
/ 23 января 2020

По сути, я вижу три основные вещи ...

Один

Вам не нужно * в запросе. 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;

Это говорит самому механизму базы данных, что значение является значением, а не частью выполняющегося запроса, и механизм базы данных знает, как безопасно обрабатывать значения.

2 голосов
/ 23 января 2020

Вы можете использовать DataAdapter, но так как вы не используете datatable, просто сделать это без так:

var sql = "DELETE FROM Members WHERE MemberId=@MemberId";
using(var cmd = new SqlCommand(sql, Lib.SqlConnection))
{
  cmd.Connection.Open();
  cmd.Parameters.Add("@MemberId",SqlDbType.Int).Value = _memberId;
  cmd.ExecuteNonQuery();
}

И если вы используете Dapper, вы можете сделать это:

Lib.SqlConnection.Execute("DELETE FROM Members WHERE MemberId=@MemberId", new {MemberId=_memberId});

Если вы все еще используете DataTables, я настоятельно рекомендую вам использовать это (или что-то подобное), чтобы упростить доступ к вашей базе данных. Это сделает CRUD logi c в базе данных быстрым, и ваш код сделает меня более управляемым, потому что вы сможете избавиться от всех лишних потребностей, связанных с приведением, упаковкой / распаковкой и уменьшением шансов ошибок времени выполнения, потому что использования строк magi c, что часто происходит с DataTables (имена столбцов). Когда вы начнете работать с классами POCO, вам не понравится использовать DataTables. Тем не менее, есть несколько мест, где DataTables являются лучшим решением (неизвестные структуры данных и т. Д. c), но это, как правило, довольно редко.

...