插入功能未采用已定义的正确列名?

时间:2019-03-06 19:03:53

标签: c# sql visual-studio

我有一个注册页面,用户可以在其中将电子邮件输入到电子邮件中。将文本和密码输入到pass.Text中,但是当我单击Enter按钮时,我得到了一个错误,似乎系统认为哈希密码和电子邮件地址是列名,所以我得到的列名不明确,后跟输入的电子邮件和哈希密码,我不确定自己做错了什么,但我想可能与INSERT函数有关。

private void enterdetails_Click(object sender, EventArgs e)
{
    string query = String.Format("INSERT INTO tbl_register(email,password) VALUES({0},{1})",
        mail.Text,Hashing.ComputeHash(pass.Text, Supported_HA.SHA256,  
        ASCIIEncoding.ASCII.GetBytes("Supported_HA.SHA256")));
    SqlConnection sqlconn = new SqlConnection(@"");
    sqlconn.Open();
    SqlCommand comm = new SqlCommand(query, sqlconn);
    comm.ExecuteNonQuery();
    sqlconn.Close();
}

1 个答案:

答案 0 :(得分:1)

  • 始终使用参数化的sql,并避免使用字符串连接将值添加到sql语句。请参见How can I add user-supplied input to an SQL statement?Exploits of a Mom。这是代码中的主要问题。
  • 还可以将您的连接实例包装在using块中(这适用于通过类型实现IDisposable的任何实例)。
  • 在某些RDBMS中,passwordemail也是保留字。您应该使用方括号将其转义。 ([email], [password])

查看已编辑的代码,确保选择正确的SqlDbType以及长度。我对两者都做了一些猜测。

private void enterdetails_Click(object sender, EventArgs e)
{
    string query = "INSERT INTO tbl_register([email],[password]) VALUES(@email,@password)";

    using(SqlConnection sqlconn = new SqlConnection(@""))
    using(SqlCommand comm = new SqlCommand(query, sqlconn))
    {
        sqlconn.Open();
        comm.Parameters.Add("@email", SqlDbType.VarChar, 200).Value = mail.Text
        comm.Parameters.Add("@password", SqlDbType.VarBinary, 256).Value = Hashing.ComputeHash(pass.Text,  Supported_HA.SHA256, ASCIIEncoding.ASCII.GetBytes("Supported_HA.SHA256"));

        comm.ExecuteNonQuery();
    }
}