Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过dropdownlist更新sql表_C#_Asp.net_Sql - Fatal编程技术网

C# 通过dropdownlist更新sql表

C# 通过dropdownlist更新sql表,c#,asp.net,sql,C#,Asp.net,Sql,我有dropdownlist(id=“myDDL”) 我有更新sql表的方法(updateTable_byDDL),当我将手动值放入SET=“bla”中时,该方法非常有效 但是当我在SET='“+myDDL.Text.ToString()+”中写入时,SQL上的列将更新为空 dropdownlist是从我放在页面加载之外的数组绑定的(在类中),我将它绑定到页面加载上: myDDL.DataSource = array; myDDL.DataBind(); 在aspx页面中,我可

我有dropdownlist(
id=“myDDL”

我有更新sql表的方法(
updateTable_byDDL
),当我将手动值放入
SET=“bla”
中时,该方法非常有效

但是当我在
SET='“+myDDL.Text.ToString()+”
中写入时,SQL上的列将更新为空

dropdownlist是从我放在
页面加载之外的数组绑定的(在类中),我将它绑定到页面加载上:

    myDDL.DataSource = array;
    myDDL.DataBind();
在aspx页面中,我可以很好地看到dropdownlist中的数组值,但是在我选择了我想要的项并单击按钮后,列变为空

我哪里做错了

  • 您应该使用
    myDDL.SelectedItem.Text
  • 您应该使用参数来避免SQL注入
  • 请查看:

       YourUpdateCommand.CommandText = "UPDATE table SET column = @NewValue WHERE conditions";
    
       YourUpdateCommand.Parameters.Add("@NewValue", System.Data.SqlDbType.VarChar, 100); //or whatever
    
       YourUpdateCommand.Parameters["@NewValue"].Value = myDDL.SelectedItem.Text;
    
       YourUpdateCommand.ExecuteNonQuery();
    
  • 您应该使用
    myDDL.SelectedItem.Text
  • 您应该使用参数来避免SQL注入
  • 请查看:

       YourUpdateCommand.CommandText = "UPDATE table SET column = @NewValue WHERE conditions";
    
       YourUpdateCommand.Parameters.Add("@NewValue", System.Data.SqlDbType.VarChar, 100); //or whatever
    
       YourUpdateCommand.Parameters["@NewValue"].Value = myDDL.SelectedItem.Text;
    
       YourUpdateCommand.ExecuteNonQuery();
    

    如果在页面加载时绑定DDL,则每次加载页面时都会绑定DDL。因此,在快速猜测代码时,只需添加一个if语句来检查page.isPostback是否正确

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ddlDemo.DataSource = new string[] { "asdf", "jklö" };
            ddlDemo.DataBind();
        }
    }
    
    protected void btnDemo_Click(object sender, EventArgs e)
    {
        Debug.WriteLine(ddlDemo.Text);
        SqlConnection con = null;
        using (con = new SqlConnection("YOUR CON STRING"))
        {
            SqlCommand com = new SqlCommand( "update tblXYZ set ABC = @A", con);
            SqlParameter param = new SqlParameter("A", System.Data.SqlDbType.YOURTYPE);
            param.Value = ddlDemo.Text;
            com.Parameters.Add(param);
            con.Open();
            int affectedRows = com.ExecuteNonQuery();
            Debug.WriteLine(affectedRows + " affected!");
            con.Close();
        }
    }
    
    在此aspx页面中

    <body>
      <form id="form1" runat="server">
    
        <asp:DropDownList ID="ddlDemo" runat="server">
        </asp:DropDownList>
        <asp:Button ID="btnDemo" runat="server" Text="Button" onclick="btnDemo_Click" />
      </form>
    </body>
    
    
    

    无论如何,在使用用户输入更新/插入/删除任何数据库记录之前,您应该始终检查用户输入

    如果在页面加载中绑定DDL,则每次加载页面时都会绑定该DDL。因此,在快速猜测代码时,只需添加一个if语句来检查page.isPostback是否正确

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ddlDemo.DataSource = new string[] { "asdf", "jklö" };
            ddlDemo.DataBind();
        }
    }
    
    protected void btnDemo_Click(object sender, EventArgs e)
    {
        Debug.WriteLine(ddlDemo.Text);
        SqlConnection con = null;
        using (con = new SqlConnection("YOUR CON STRING"))
        {
            SqlCommand com = new SqlCommand( "update tblXYZ set ABC = @A", con);
            SqlParameter param = new SqlParameter("A", System.Data.SqlDbType.YOURTYPE);
            param.Value = ddlDemo.Text;
            com.Parameters.Add(param);
            con.Open();
            int affectedRows = com.ExecuteNonQuery();
            Debug.WriteLine(affectedRows + " affected!");
            con.Close();
        }
    }
    
    在此aspx页面中

    <body>
      <form id="form1" runat="server">
    
        <asp:DropDownList ID="ddlDemo" runat="server">
        </asp:DropDownList>
        <asp:Button ID="btnDemo" runat="server" Text="Button" onclick="btnDemo_Click" />
      </form>
    </body>
    
    
    


    无论如何,在使用用户输入更新/插入/删除任何数据库记录之前,您应该始终检查用户输入

    这是教科书上的注射攻击材料。你能解释一下吗,@p.Brian.Mackey?谢谢你提供的信息,我以后会用到的。但现在-该网站只供我在我的电脑中使用…哦,如果每次“这仅用于本地测试”功能投入生产时我都能得到1美元的话…这是教科书上的注入攻击材料。你能解释一下吗,@P.Brian.Mackey?谢谢你提供的信息,我以后会使用它。但现在-该网站只供我在我的计算机中使用…哦,如果每次“这仅用于本地测试”功能投入生产时我都能得到1美元就好了…关于SQL注入攻击,你的建议很好;然而,问题不是他没有做
    myDDL.SelectedItem
    ,因为
    myDDL.Text
    与做
    myDDL.SelectedItem.Value
    myDDL.SelectedValue
    是一样的。这里是MSDN参考:像一个魔咒一样工作。我还将听取大家关于注射攻击的建议。谢谢@伊卡洛斯他们不是一回事。我建议的是
    SelectedItem.Text
    ,而不是
    SelectedValue
    @Bside非常感谢您的反馈。@Bside请不要忘了将答案标记为正确,如果它是您正在寻找的。您对SQL注入攻击的建议很好;然而,问题不是他没有做
    myDDL.SelectedItem
    ,因为
    myDDL.Text
    与做
    myDDL.SelectedItem.Value
    myDDL.SelectedValue
    是一样的。这里是MSDN参考:像一个魔咒一样工作。我还将听取大家关于注射攻击的建议。谢谢@伊卡洛斯他们不是一回事。我建议的是
    SelectedItem.Text
    ,而不是
    SelectedValue
    @Bside非常感谢您的反馈。@Bside请不要忘记将答案标记为正确,如果它是您要找的。