首页 > 解决方案 > 'Bairstow' 附近的语法不正确。我收到存储在 sql server 中的播放器名称错误

问题描述

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

标签: c#asp.netsql-servervisual-studio

解决方案


这比你知道的还要糟糕。在当前代码中,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";
}

总是总是 总是使用这样的参数将数据放入查询中!任何更少的事情实际上都是乞求从现在起一年后发现你在六个月前被黑客入侵了。如果应用程序中有任何其他代码使用这样的字符串连接来构建 SQL,那么修复它(因为它真的被破坏了)是工作 #1。


推荐阅读