0
//the @Question column name needs to change according to the checkbox. For example Checkbox1 - Question1

SqlConnection con = new SqlConnection(...);
String sql = "UPDATE INQUIRY2 set @Question = @str WHERE email = @email AND base = @base;";

SqlCommand cmd = new SqlCommand(sql, con);
con.Open();

    //checkbox2 - question 2
    //if (CheckBox3.Checked == true)
    //{
      //  str = str + CheckBox3 + 'x';
    //}


    DataTable theDataTable = null;

       // Verify that dt is actually in session before trying to get it

        if(Session["dt"] != null)
        {
            theDataTable = Session["dt"] as DataTable;
        }

    //Verify that the data table is not null
    if(theDataTable != null)
    {
        email = theDataTable.Rows[0]["email"].ToString();
        base1 = theDataTable.Rows[0]["base"].ToString();

    }
    //checkbox1 - question 1
    if (CheckBox9.Checked == true)
    {
        str = str + CheckBox9.Text + 'x';
        strQuestOne = theDataTable.Columns["Question1"].ToString();

    }


    cmd.Parameters.AddWithValue("@email", email);
    cmd.Parameters.AddWithValue("@str", str);
    cmd.Parameters.AddWithValue("@Question", strQuestOne);
    cmd.Parameters.AddWithValue("@base", base1);


    cmd.ExecuteNonQuery();
    con.Close();
4

2 回答 2

3

您正在为列名使用参数。数据库对象(列名、表、存储过程或任何其他对象)不能作为参数传递。只有列或变量的实际值才能作为参数。在这种情况下,您需要动态构建 SQL 语句:

String sql ="UPDATE INQUIRY2 set " + strQuestOne + "= @str WHERE email = ...

但是现在你应该小心,因为你的代码有受到 SQL 注入攻击的风险。

于 2013-08-23T20:47:19.647 回答
0

您的 SQL 在字符串中使用 @param 类型。

如果您希望执行某种存储过程来消除网站上的大多数 sql 注入攻击,您可能需要考虑调用存储过程并将 SqlCommand.Parameter 添加到 SqlCommand.Parameters 集合中。

否则,如果你只想执行你应该做的 sql

string sql = String.Format("UPDATE TABLE set COLUMN = {0} where OTHERCOLUMN = {1}", varValue, varWhere);

于 2013-08-23T20:46:20.377 回答