c# - 插入函数没有采用定义的正确列名?
问题描述
我有一个注册页面,用户可以在其中输入电子邮件到 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();
}
解决方案
- 始终使用参数化 sql 并避免字符串连接来向 sql 语句添加值。请参阅如何将用户提供的输入添加到 SQL 语句?, 和Exploits of a Mom。这是您的代码中的主要问题。
- 还将您的连接实例包装在块中(适用于由该类型实现的
using
任何实例)。IDisposable
- 也是一些 RDBMS 中的保留字
password
。email
您应该使用括号将它们转义。([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();
}
}
推荐阅读
- react-native - React-native:如何在不使用库的情况下将项目从一个平面列表拖放到另一个平面列表?
- sql - 查找过去 30 天内从未成功运行的 SSRS 订阅?
- kubernetes - 卡夫卡超时等待节点分配
- ios - Swift 未定义的 OBJC 类符号
- python - How to return item in list after list is matched against data set in Python?
- javascript - 如何在javascript中显示表格中某些列的总和?
- node.js - 从 ftp 下载文件并将其传递给客户端
- javascript - 如何从组件传递道具
- node.js - EADDRINUSE: 地址已在使用 :::3000 -- 未找到活动进程
- angular - Angular 网站在 GitHub Pages 中发布后损坏,但可以在本地运行