C# 如何从数据库中删除整行

C# 如何从数据库中删除整行,c#,database,winforms,ado.net,C#,Database,Winforms,Ado.net,我如何从sql数据库中删除一行,无论是使用存储过程还是不使用存储过程,现在我已经尝试不使用按钮。 这就是我到目前为止所得到的,_memberid是从数据库(用于上下文)的不同表单发送过来的 您可以使用DataAdapter,但由于您不使用datatable,因此不使用以下内容更容易: var sql = "DELETE FROM Members WHERE MemberId=@MemberId"; using(var cmd = new SqlCommand(sql, Lib.SqlConnec

我如何从sql数据库中删除一行,无论是使用存储过程还是不使用存储过程,现在我已经尝试不使用按钮。 这就是我到目前为止所得到的,_memberid是从数据库(用于上下文)的不同表单发送过来的


您可以使用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();
}
cmd.CommandText = "Delete From Members where MemberId = @memberId";
cmd.Parameters.Add("@memberId", SqlDbType.Int);
cmd.Parameters["@memberId"].Value = _memberId;
如果您正在使用,您可以执行以下操作:

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

如果您仍然使用DataTables,我强烈建议您考虑使用它(或类似的东西)来简化数据库访问。这将使数据库上的CRUD逻辑变得轻而易举,而且您的代码将使我更易于维护,因为您可以摆脱执行强制转换、装箱/取消装箱的所有奇怪需要,并减少运行时出现错误的机会,因为在数据表(列名)中经常使用魔术字符串。一旦您开始使用POCO类,您就会讨厌使用数据表。也就是说,在一些地方,数据表是一个更好的解决方案(未知的数据结构等),但这些地方通常非常罕见。

我看到的主要有三件事

一个

查询中不需要
*
DELETE
会影响整行,因此无需指定列。就像这样:

DELETE FROM SomeTable WHERE SomeColumn = 123
两个

这里不需要使用
SqlDataAdapter
,只需执行以下操作即可。例如:

cmd.ExecuteNonQuery();
“non-query”基本上是一个SQL命令,它不查询数据以获取结果。在此上下文中,插入、更新和删除通常是“非查询”。它将返回的只是受影响的行数,如果需要的话,您可以使用它来双重检查它是否与您期望的匹配

三个

不要这样做:

这种字符串连接导致SQL注入。虽然从直觉上看,它就像是在使用
\u memberId
作为查询值,但从技术上讲,它是在使用可执行代码。对于数值来说,这不太可能(虽然不是不可能)是一个问题,但是对于字符串值来说,这是一个巨大的问题,因为这意味着用户可以向您发送任何字符串,您将以代码的形式执行它

相反,使用。例如,您可以执行以下操作:

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();
}
cmd.CommandText = "Delete From Members where MemberId = @memberId";
cmd.Parameters.Add("@memberId", SqlDbType.Int);
cmd.Parameters["@memberId"].Value = _memberId;

这会告诉数据库引擎本身,该值是一个值,而不是正在执行的查询的一部分,数据库引擎知道如何安全地处理值。

如果您试图执行一个简单的基于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注入。

如果这是一个问题,则有一种方法。您发布了一些代码,但它对您不起作用吗?你有例外吗?它表现出什么样的行为?它什么也不做,它所在的拨号框关闭,行保持不变,对不起,我忘记添加了哦,.AddWithValue的弊病请看和另一个:这是另一个移动
连接。Open()
直接在
命令之前。ExecuteNonQuery()我知道,吹毛求疵。:-)@玛丽,谢谢你提供AddWithValue的信息。我不知道。我已经有一段时间没有直接使用SDO.Net了。