行删除 ADO.Net、ASP.Net
Row Deletion ADO.Net, ASP.Net
我正在尝试使用联系人列表,并希望在我输入某个人的姓名时删除其所有信息。我正在使用 sql table -命名的联系人-,其中包含联系人的姓名、电子邮件和地址。我有以下代码:
protected void Delete_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString);
con.Open();
string delete = "DELETE FROM Contact WHERE Name =" + NameToDelete.Text;
SqlCommand cmd = new SqlCommand(delete, con);
try
{
cmd.Parameters.AddWithValue("@Name", delete);
cmd.ExecuteNonQuery();
Response.Redirect("ViewContacts.aspx");
}
catch(Exception ex)
{
Response.Write(ex);
}
}
当我使用它时,它似乎将名称列与我输入的名称进行比较。因此名称 Bill 将与 header 名称列进行比较,而不是名称中的内容。
您需要在 var(char) 类型的值周围使用单引号。如果您不使用引号,它会认为您引用的是列名而不是值。
它对所有数据库都有效,以下来自 oracle 文档:
character literals are enclosed in single quotation marks, which
enable Oracle to distinguish them from schema object names.
https://docs.oracle.com/cd/A87860_01/doc/server.817/a85397/sql_elem.htm
string delete = "DELETE FROM Contact WHERE Name ='" + NameToDelete.Text + "'";
实际上你想做的是使用sql命令参数,那么你需要在sql语句中使用@[ParameterName]来使用参数名称。
string delete = "DELETE FROM Contact WHERE Name = @Name";
您的问题似乎是您在两个实例中使用了变量 delete。首先用于创建正确的命令,其次用于创建参数值,这是错误的。在参数值中,您可能必须使用要删除的值。
你的代码有几个严重的问题。
您的连接永远不会关闭或处置。使用 Using 块,即使出现错误也会关闭和处理数据库对象。
您正在连接一个字符串以使您的 Sql 语句冒着 Sql 注入和损坏数据库的风险。
当 Sql 语句中没有参数时,您正在向命令添加参数。
您正在使用 .AddWithValue ,它将参数名称和参数值作为参数。您已提供整个 Sql 语句作为 @Name 的值。这应该是 NameToDelete.Text.
不要使用 .AddWithValue。使用 .Add(parameter Name, Sql data type).Value = 参数值。这可以加快查询速度并避免数据库中的类型不匹配。
如果 name 是您的主键,您可以,但如果不是,您应该通过主键删除或发送 Where 子句中的所有值。
protected void Delete_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString))
{
string delete = "DELETE FROM Contact WHERE Name = @Name;"; //no single quotes to worry about
using (SqlCommand cmd = new SqlCommand(delete, con))
{
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = NameToDelete.Text; //just guessed at the VarChar - check your database for type
try
{
con.Open();
cmd.ExecuteNonQuery();
Response.Redirect("ViewContacts.aspx");
}
catch (Exception ex)
{
Response.Write(ex.Message); //ex by itself, will get you nothing but the fully qualified name of Exception
}
}
}
}
我正在尝试使用联系人列表,并希望在我输入某个人的姓名时删除其所有信息。我正在使用 sql table -命名的联系人-,其中包含联系人的姓名、电子邮件和地址。我有以下代码:
protected void Delete_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString);
con.Open();
string delete = "DELETE FROM Contact WHERE Name =" + NameToDelete.Text;
SqlCommand cmd = new SqlCommand(delete, con);
try
{
cmd.Parameters.AddWithValue("@Name", delete);
cmd.ExecuteNonQuery();
Response.Redirect("ViewContacts.aspx");
}
catch(Exception ex)
{
Response.Write(ex);
}
}
当我使用它时,它似乎将名称列与我输入的名称进行比较。因此名称 Bill 将与 header 名称列进行比较,而不是名称中的内容。
您需要在 var(char) 类型的值周围使用单引号。如果您不使用引号,它会认为您引用的是列名而不是值。 它对所有数据库都有效,以下来自 oracle 文档:
character literals are enclosed in single quotation marks, which enable Oracle to distinguish them from schema object names.
https://docs.oracle.com/cd/A87860_01/doc/server.817/a85397/sql_elem.htm
string delete = "DELETE FROM Contact WHERE Name ='" + NameToDelete.Text + "'";
实际上你想做的是使用sql命令参数,那么你需要在sql语句中使用@[ParameterName]来使用参数名称。
string delete = "DELETE FROM Contact WHERE Name = @Name";
您的问题似乎是您在两个实例中使用了变量 delete。首先用于创建正确的命令,其次用于创建参数值,这是错误的。在参数值中,您可能必须使用要删除的值。
你的代码有几个严重的问题。
您的连接永远不会关闭或处置。使用 Using 块,即使出现错误也会关闭和处理数据库对象。
您正在连接一个字符串以使您的 Sql 语句冒着 Sql 注入和损坏数据库的风险。
当 Sql 语句中没有参数时,您正在向命令添加参数。
您正在使用 .AddWithValue ,它将参数名称和参数值作为参数。您已提供整个 Sql 语句作为 @Name 的值。这应该是 NameToDelete.Text.
不要使用 .AddWithValue。使用 .Add(parameter Name, Sql data type).Value = 参数值。这可以加快查询速度并避免数据库中的类型不匹配。
如果 name 是您的主键,您可以,但如果不是,您应该通过主键删除或发送 Where 子句中的所有值。
protected void Delete_Click(object sender, EventArgs e) { using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString)) { string delete = "DELETE FROM Contact WHERE Name = @Name;"; //no single quotes to worry about using (SqlCommand cmd = new SqlCommand(delete, con)) { cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = NameToDelete.Text; //just guessed at the VarChar - check your database for type try { con.Open(); cmd.ExecuteNonQuery(); Response.Redirect("ViewContacts.aspx"); } catch (Exception ex) { Response.Write(ex.Message); //ex by itself, will get you nothing but the fully qualified name of Exception } } } }