正如我在评论中所说-你应该始终在查询中使用参数- 绝不要自己将SQL语句串联在一起。
此外:我建议将单击事件处理程序与实际插入数据的代码分开。
因此,我会将您的代码重写为以下内容:
在您的网页代码后台文件(yourpage.aspx.cs
)中
private void button1_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=DELL-PC;initial catalog=AdventureWorks2008R2 ; User ID=sa;Password=sqlpass;Integrated Security=SSPI;";
InsertData(connectionString,
textBox1.Text.Trim(), -- first name
textBox2.Text.Trim(), -- last name
textBox3.Text.Trim(), -- user name
textBox4.Text.Trim(), -- password
Convert.ToInt32(comboBox1.Text), -- age
comboBox2.Text.Trim(), -- gender
textBox7.Text.Trim() ); -- contact
}
在其他一些代码中(例如 databaselayer.cs
):
private void InsertData(string connectionString, string firstName, string lastname, string username, string password
int Age, string gender, string contact)
{
string query = "INSERT INTO dbo.regist (FirstName, Lastname, Username, Password, Age, Gender,Contact) " +
"VALUES (@FirstName, @Lastname, @Username, @Password, @Age, @Gender, @Contact) ";
using(SqlConnection cn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(query, cn))
{
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = firstName;
cmd.Parameters.Add("@Lastname", SqlDbType.VarChar, 50).Value = lastName;
cmd.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = userName;
cmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password;
cmd.Parameters.Add("@Age", SqlDbType.Int).Value = age;
cmd.Parameters.Add("@Gender", SqlDbType.VarChar, 50).Value = gender;
cmd.Parameters.Add("@Contact", SqlDbType.VarChar, 50).Value = contact;
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
}
像这样的代码:
- 不容易受到 SQL 注入攻击
- 在 SQL Server 上执行速度更快(因为查询语句只会被解析一次成执行计划,然后缓存并在以后重用)
- 将事件处理程序(代码后置文件)与实际的数据库代码分开(把东西放在它们应该在的地方-有助于避免“超重”的代码后置文件,其中包含大量的意大利面条代码,从处理 UI 事件到访问数据库 - 不是一个好的设计!)