我已尝试将以下代码保存到数据库中。条件是,我在下拉列表中有一个值,值为New = 1,old = 2。如果用户选择1或新,则它将数据保存到数据库,或者如果他们选择旧,则它将显示存在的数据。
现在这次我的标签显示已插入数据,但数据未保存到表格中(但未显示任何错误)。
protected void btnsave_Click(object sender, EventArgs e)
{
if (ddl.Text=="1")
{
cs.Open();
string query = "insert into resig (@id,@name,@email) values('"+txtgn.Text+"','"+txtgname.Text+"','"+txtsg.Text+"')";
SqlCommand cmd = new SqlCommand(query,cs);
lbdmsg.Text = "Data Inserted";
//txtgname.Text = ddl.SelectedItem.ToString();
}
else
{
cs.Open();
string query = "select name, email from resig where id='" + txtgn + "'";
SqlCommand cmd= new SqlCommand(query,cs);
dr =cmd.ExecuteReader();
while(dr.Read())
{
string name= txtgname.Text;
string email=txtsg.Text;
}
cs.Close();
}
}
答案 0 :(得分:3)
我看到两件事;
ExecuteNonQuery()
执行插入命令。您应该使用parameterized queries
。这种字符串连接对SQL Injection
攻击开放。
例如;
if (ddl.Text == "1")
{
string query = "insert into resig (id,name,email) values(@id, @name, @email)";
SqlCommand cmd = new SqlCommand(query,cs);
cmd.Parameters.AddWithValue("@id", txtgn.Text);
cmd.Parameters.AddWithValue("@name", txtgname.Text);
cmd.Parameters.AddWithValue("@email", txtsg.Text);
cs.Open();
cmd.ExecuteNonQuery();
}
答案 1 :(得分:1)
调用cmd.ExecuteNonQuery()
在db上运行命令
答案 2 :(得分:1)
您的SQL既错误又非常危险/易受SQL注入攻击。括号中的第一个列表必须是列列表,值列表应该是避免SQL注入的参数:
string query = "insert into resig (id, name, email) values(@id, @name, @email)";
SqlCommand cmd = new SqlCommand(query, cs);
cmd.Parameters.Add(new SqlParameter("@id", txtgn.Text));
cmd.Parameters.Add(new SqlParameter("@name", txtgname.Text));
cmd.Parameters.Add(new SqlParameter("@email", txtsg.Text));
cmd.ExecuteNonQuery();
您也应该参数化select语句。为什么这很重要?如果用户为id输入了此ID并选择了旧的SQL,请考虑生成的SQL:
';删除resig; -
通过连接用户输入来构建SQL会打开您的数据库,让用户心怀异想,并且永远不应该使用这个时代。无数网站遭到破坏,数据被破坏 - 当天回想起来,但现在我们知道的更好了,没有任何借口。