首页 > 解决方案 > 插入函数没有采用定义的正确列名?

问题描述

我有一个注册页面,用户可以在其中输入电子邮件到 mail.Text 和密码到 pass.Text,但是当我单击输入按钮时出现错误,似乎系统认为散列密码和电子邮件地址是列名所以我得到无效的列名,后跟输入的电子邮件和哈希密码,我不确定我做错了什么,但我认为这可能与我的 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();
}

标签: c#sqlvisual-studio

解决方案


  • 始终使用参数化 sql 并避免字符串连接来向 sql 语句添加值。请参阅如何将用户提供的输入添加到 SQL 语句?, 和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();
    }
}

推荐阅读