C# 如何从数据库中删除整行
我如何从sql数据库中删除一行,无论是使用存储过程还是不使用存储过程,现在我已经尝试不使用按钮。 这就是我到目前为止所得到的,_memberid是从数据库(用于上下文)的不同表单发送过来的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
您可以使用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了。