【发布时间】:2016-07-19 16:23:09
【问题描述】:
有人建议我用 SqlParameter 替换我的代码,以避免将 SQL 注入作为安全问题,但我的理解有限。我尝试实现它,但我遇到了一个错误:
必须声明标量变量
我尝试了其他线程的其他建议,即为每次插入实现一个新参数,而不是为每个条目替换参数值。
String query = "INSERT INTO EmpInfo(EmpYear, EmpStatus, LName, FName, JobTitle, EmpPay, EmpDoB, EmpSex, EmpAddr, EmpCity, EmpState, EmpZIP, EmpCountry, EmpEAddr, EmpTelNo, EmpMobileNo, EmpDate) " +
"VALUES('"+EmpYear+"', @EmpStatus, @LName, @FName, @JobTitle, @EmpPay, @EmpDoB, @EmpSex, @EmpAddr, @EmpCity, @EmpState, @EmpZIP, @EmpCountry, @EmpEAddr, @EmpTelNo, @EmpMobileNo, getdate())";
String query2 = "INSERT INTO AccountInfo(LName, FName, EmpTemplate, AccountType, EmpStatus, EmpDate) " +
"VALUES (@LName, @FName, @EmpTemplate, @AccountType, @EmpStatus, GetDate())";
using (SqlConnection connection = new SqlConnection("Data Source=RB-DESKTOP;Initial Catalog=TimeDB;Persist Security Info=True;User ID=sa;Password=bautista7"))
{
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Connection = conn;
conn.Open();
cmd.CommandText = "SELECT MAX(EmpID) FROM EmpInfo";
SqlDataReader rdr = cmd.ExecuteReader();
rdr.Close();
SqlCommand command = new SqlCommand(query, cmd.Connection);
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpYear", Value = EmpYear });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpStatus", Value = "Active" });
command.Parameters.Add(new SqlParameter() { ParameterName = "@LName", Value = regLname_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@FName", Value = regFname_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@JobTitle", Value = "NULL" });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpPay", Value = PayType_cb.SelectedItem.ToString() });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpDoB", Value = regDob_dtp.Value.Date });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpSex", Value = gender });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpAddr", Value = regAddr_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCity", Value = regCity_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpState", Value = regState_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpZIP", Value = regZip_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCountry", Value = regCountry_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpEAddr", Value = regEmail_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpTelNo", Value = regTel_text.Text });
command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpMobileNo", Value = regMob_text.Text });
command.ExecuteNonQuery();
command.Parameters.Clear();
SqlCommand command2 = new SqlCommand(query2, cmd.Connection);
command.Parameters.AddWithValue("@LName", regLname_text.Text);
command.Parameters.AddWithValue("@FName", regFname_text.Text);
command.Parameters.AddWithValue("@EmpTemplate", template);
command.Parameters.AddWithValue("@AccountType", AcctType_cb.SelectedItem.ToString());
command.Parameters.AddWithValue("@EmpStatus", "Active");
command.ExecuteNonQuery();
command.Parameters.Clear();
【问题讨论】:
-
错误是什么?请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
-
我真的很抱歉,但它写在段落上。我处理了“必须声明标量变量”的例外情况,不仅仅是一列,如果不是全部,大多数。
-
但是哪一行导致你出现这个错误,确切的错误是什么?也可以先尝试用一个字段较少的简单表进行测试,这样你就可以更容易地关注错误。How to create a Minimal, Complete, and Verifiable example
-
到目前为止我注意到的有 empyear、jobTitle 和 EmpPay,可能更多,因为一旦它抛出异常,它就会停止。这就是我得到的。异常来自 command.ExecuteNonQuery();出现错误“必须声明标量变量”。
-
您还添加了
@EmpYear参数,但实际上并没有使用它。
标签: c# sql sql-server winforms