我正在使用Visual Studio 2015,Windows窗体应用程序
我的SqlCommand
有效 - 除了Street
列(Street VARCHAR(70)
),它从文本框(streetTextBox.Text
)获取输入,如果有,则会引发错误空格或如果它不是数字。我可以手动输入数据库,只要街道文本框只是一个没有空格的数字,命令就可以正常工作。
comm2 = new SqlCommand("insert into Addresses(Street, City, aState, Zip) values (" + streetTextBox.Text + ",'" + cityTextBox.Text + "','" + aStateTextBox.Text + "','" + zipTextBox.Text + "')", conn);
try
{
comm.ExecuteNonQuery();
comm2.ExecuteNonQuery();
MessageBox.Show("Saved...");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
为什么不允许保存实际的街道? (即街道名称555)
答案 0 :(得分:0)
您收到了错误消息,因为如果它的varchar需要单引号,那么您就错过了它们。
values ('" + streetTextBox.Text + "'
但请使用Parameters,以防止出现此类问题和SQL注入
答案 1 :(得分:0)
您的代码是sql injection攻击的开门。 您需要使用parameters而不是将字符串连接到sql。
comm2 = new SqlCommand("insert into Addresses(Street, City, aState, Zip) values (@Street, @City,@aState, @Zip)", conn);
comm2.Parameters.Add("@Street", SqlDbType.NVarChar).Value = streetTextBox.Text;
comm2.Parameters.Add("@City", SqlDbType.NVarChar).Value = cityTextBox.Text;
comm2.Parameters.Add("@aState", SqlDbType.NVarChar).Value = aStateTextBox.Text;
comm2.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = zipTextBox.Text;
try
{
comm.ExecuteNonQuery();
comm2.ExecuteNonQuery();
MessageBox.Show("Saved...");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}