首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有addwithvalue sql参数的错误

带有addwithvalue sql参数的错误
EN

Stack Overflow用户
提问于 2016-07-19 16:23:09
回答 2查看 1.9K关注 0票数 1

有人建议我用SqlParameter代替我的代码,以避免将SQL注入作为一个安全问题,但我的理解有限。我试着实现它,但是我遇到了一个错误:

必须声明标量变量

我尝试了其他线程关于为每个插入实现一个新参数的其他建议,而不是替换每个条目的参数值。

代码语言:javascript
运行
复制
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();
EN

Stack Overflow用户

回答已采纳

发布于 2016-07-19 16:41:26

在创建command之后,您将使用command2变量两次而不是使用command2。获得错误是因为清除了所有参数的command,然后添加参数(与现有查询不匹配),然后执行ExecuteNonQuery,然后抛出错误。

更改第二个执行语句/命令,如下所示,请注意,在创建command2之后,它现在也被使用而不是重用command

代码语言:javascript
运行
复制
SqlCommand command2 = new SqlCommand(query2, cmd.Connection);
command2.Parameters.AddWithValue("@LName", regLname_text.Text);
command2.Parameters.AddWithValue("@FName", regFname_text.Text);
command2.Parameters.AddWithValue("@EmpTemplate", template);
command2.Parameters.AddWithValue("@AccountType", AcctType_cb.SelectedItem.ToString());
command2.Parameters.AddWithValue("@EmpStatus", "Active");
var numberOfRecordsInserted = command2.ExecuteNonQuery();

// value of numberOfRecordsInserted should be 1

而且,当您使用SqlCommand完成时,您可以释放它,除非您计划重用与您没有的完全相同的SqlCommand实例(至少在已发布的代码中没有),否则不需要调用SqlCommand.Parameters.Clear()

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38463844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档