0 c# sql-server asp.net visual-studio
protected void btn_Save_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox status = row.Cells[1].FindControl("cb_Cap") as CheckBox;
//int Credits = Convert.ToInt32(row.Cells[0].Text);
string Name = Convert.ToString(row.Cells[0].Text);
if (status.Checked)
{
updaterow(Name, "Captain");
}
else
{
updaterow(Name, "None");
}
}
}
private void updaterow(string Name, string markstatus)
{
string mycon = @"Data Source=DESKTOP-7IGRD5V\SQLEXPRESS; Initial Catalog =ULogin; Integrated Security = True";
string updateData = "Update teamf set role='" + markstatus + "' where Name=" + Name;
SqlConnection con = new SqlConnection(mycon);
con.Open();
SqlCommand cmd = new SqlCommand(updateData);
cmd.Connection = con;
cmd.ExecuteNonQuery();
lbl_Cap.Text = "Captain Added";
con.Close();
}
Run Code Online (Sandbox Code Playgroud)
这比你知道的还要糟糕。在当前代码中,con.Close();如果出现异常,该行将不会运行。如果这种情况经常发生,您可以完全运行 Sql Server 的连接并有效地将自己锁定在数据库之外。
更糟糕的是,我可以使用该Name值在您的服务器上运行任何我想要的任意代码,只需以'';. 想象一下,如果我决定告诉你我的名字是'';Drop Table teamf;。仔细想想会发生什么。
这应该可以解决这两个问题,并解决您的问题:
private void updaterow(string Name, string markstatus)
{
string mycon = @"Data Source=DESKTOP-7IGRD5V\SQLEXPRESS; Initial Catalog =ULogin; Integrated Security = True";
string updateData = "UPDATE teamf SET role= @Role WHERE Name = @Name";
using (var conn = new SqlConnection(mycon))
using (var cmd = new SqlCommand(updateData, conn))
{
// Use actual column types and lengths from the database here
cmd.Parameters.Add("@Role", SqlDbType.NVarChar, 25).Value = markstatus;
cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 25).Value = Name;
con.Open();
cmd.ExecuteNonQuery();
} //using block will guarantee the connection is closed, *even if an exception is thrown*
lbl_Cap.Text = "Captain Added";
}
Run Code Online (Sandbox Code Playgroud)
总是总是 总是用这样的参数将数据放入一个查询!任何更少的事情实际上都是乞求从现在起一年后醒来发现你在六个月前被黑客入侵。如果应用程序中有任何其他代码使用像这样的字符串连接来构建 SQL,那么修复它(因为它真的坏了)是工作 #1。