簡體   English   中英

如何從數據庫中刪除整行

[英]How do I delete an entire row from a database

我將如何使用存儲過程或不使用存儲過程從 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;
    }

如果你想做一個簡單的基於 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 注入。

您可以使用 DataAdapter,但由於您沒有使用數據表,所以不這樣做會更容易:

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});

如果您仍在使用數據表,我強烈建議您考慮使用這個(或類似的東西)來簡化您的數據庫訪問。 它將使數據庫上的 CRUD 邏輯變得輕而易舉,並且您的代碼將更易於維護,因為您可以擺脫所有奇怪的轉換、裝箱/拆箱需求,並減少由於使用而出現運行時錯誤的機會DataTables(列名)經常出現的魔術字符串。 一旦開始使用 POCO 類,您就會厭惡必須使用 DataTables。 也就是說,在某些地方 DataTables 是更好的解決方案(未知數據結構等),但這些地方通常很少見。

我看到的基本上是三件主要的事情......

您不需要查詢中的* DELETE影響整行,因此無需指定列。 所以就像:

DELETE FROM SomeTable WHERE SomeColumn = 123

這里不需要SqlDataAdapter ,你需要做的就是執行查詢 例如:

cmd.ExecuteNonQuery();

“非查詢”基本上是一個不查詢數據以獲取結果的 SQL 命令。 在此上下文中,插入、更新和刪除通常是“非查詢”。 它會返回的只是受影響的行數,您可以使用它來仔細檢查它是否符合您的預期(如有必要)。

不要這樣做

cmd.CommandText = "Delete From Members where MemberId = " + _memberId;

這種字符串連接會導致SQL 注入 雖然從直覺上看,您是在將_memberId用作查詢值,但從技術上講,您是在將其用作可執行代碼 它不太可能(雖然不是不可能)成為數值的問題,但它是字符串值的一個大問題,因為這意味着用戶可以向您發送任何字符串,您將以代碼的形式執行它

相反,使用查詢參數 例如,您可能會這樣做:

cmd.CommandText = "Delete From Members where MemberId = @memberId";
cmd.Parameters.Add("@memberId", SqlDbType.Int);
cmd.Parameters["@memberId"].Value = _memberId;

這告訴數據庫引擎本身該值是一個值而不是正在執行的查詢的一部分,並且數據庫引擎知道如何安全地處理值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM