C# 通过dropdownlist更新sql表
我有dropdownlist(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页面中,我可
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请不要忘记将答案标记为正确,如果它是您要找的。