在将值插入数据库时,我遇到错误,主题中所说的错误不知道我缺少什么。
string ImagePath = "";
string str = "insert into AdminAssistant() values('"+TextBox7.Text+ "','" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + DropDownList2.Text + "','" + TextBox4.Text + "','" + DropDownList1.Text+ "','" + TextBox9.Text + "','"+ImagePath+"','"+DateTime.Now+"','Active')";
SqlCommand cmd = new SqlCommand(str,con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
Label1.Text = "Admin Created Successfully.....!!!";
下面是查询
Create Table AdminAssistant
(
A_ID int identity(1,1) not null primary key,
Aname varchar(20),
Aphone varchar(16),
Amail varchar(20),
A_Address varchar(150),
A_City varchar(20),
A_Gender varchar(10)NOT NULL CHECK (A_Gender IN('Male', 'Female')),
A_Password varchar(20),
Aroll varchar(20)NOT NULL CHECK (Aroll IN('SuperAdmin', 'Admin')),
MetaDescription varchar(256),
Media varchar(40),
RegisterDate datetime,
A_Status varchar(20)NOT NULL CHECK (A_Status IN('Active', 'Disable'))
)
我认为尽管存在错误,但仍应将此值插入数据库。
答案 0 :(得分:2)
该错误可能是由表名后面的括号引起的,但这是一个简单的解决方法。
您真正的问题在于值的字符串连接。
在sql世界中这是一个禁忌,因为它可能是许多解析错误的根源(例如,值中存在单引号可能会破坏语法,并且 DateTime.Now 会被转换遵循规则的字符串,SQL解析器引擎并不总是能够理解。)
但是最重要的是Sql注入的可能性。
这里有一些链接可以帮助您开始发现这种巨大的安全风险
How can I explain Sql Injection without technical jargon。
How does the SQL injection from the “Bobby Tables” XKCD comic work?
因此,唯一的解决方法是通过参数化查询。
string str = "insert into AdminAssistant
(Aname,Aphone,Amail,A_Address,A_City,A_Gender,A_Password,
Aroll,MetaDescription,Media,RegisterDate,A_Status)
values(@name,@phone,@mail,@address,@city,@gender,@pass
@roll,@descr,@media,@regdata,'Active')";
using(SqlConnection con = new SqlConnection(......))
using(SqlCommand cmd = new SqlCommand(str, con))
{
con.Open();
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = TextBox7.Text;
... other varchar parameters
cmd.Parameters.Add("@regdataq", SqlDbType.DateTime).Value = DateTime.Now;
... complete the parameters collection
cmd.ExecuteNonQuery();
}
而且,我忘了谈论将明文密码存储到数据库中的问题。这是您安全性的另一个非常重要的考虑因素。这是另一个包含有用信息的链接