数据库更新仅在某些情况下有效

时间:2011-07-12 17:26:47

标签: c# asp.net sql database bit

  

可能重复:
  Data not writing out to Database

我正在尝试使用复选框的checkedchanged事件更新数据库中的位字段。当它被检查时,它发送1.当它被取消选中时,它发送一个0.现在我不知道为什么,但这些更改只在某些时候被保存。这会与“!IsPostBack”有什么关系吗?

 protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
        {
            connection.Open();
            dataAdapter = new SqlDataAdapter("SELECT * FROM SecureOrders", connection);
            dataSet = new DataSet();             
            dataAdapter.Fill(dataSet, "SecureOrders");
            DataView source = new DataView(dataSet.Tables[0]);
            DefaultGrid.DataSource = source;
            DefaultGrid.DataBind();
            connection.Close();
        }
    }
}

protected void CheckBoxProcess_CheckedChanged(object sender, EventArgs e)
{
    bool update;
    string checkedString = "UPDATE SecureOrders SET processed = 1 WHERE fName LIKE '%" + DefaultGrid.SelectedRow.Cells[2].Text + "%' AND lName LIKE '% " + DefaultGrid.SelectedRow.Cells[3].Text + "%'";
    string uncheckedString = "UPDATE SecureOrders SET processed = 0 WHERE fName LIKE '%" + DefaultGrid.SelectedRow.Cells[2].Text + "%' AND lName LIKE '% " + DefaultGrid.SelectedRow.Cells[3].Text + "%'";
    CheckBox cb = (CheckBox)sender;
    GridViewRow gvr = (GridViewRow)cb.Parent.Parent;
    DefaultGrid.SelectedIndex = gvr.RowIndex;
    update = Convert.ToBoolean(DefaultGrid.SelectedValue);

    orderByString = orderByList.SelectedItem.Value;
    fieldString = searchTextBox.Text;



    connectionString = rootWebConfig.ConnectionStrings.ConnectionStrings["secureodb"];

    using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
    {
        connection.Open();
        SqlCommand checkedCmd = new SqlCommand(checkedString, connection);
        SqlCommand uncheckedCmd = new SqlCommand(uncheckedString, connection);

        if (cb.Checked == true)
        {
            checkedCmd.ExecuteNonQuery();

        }
        else
        {
            uncheckedCmd.ExecuteNonQuery();
        }

        connection.Close();
    }

2 个答案:

答案 0 :(得分:1)

我建议在DataView上将“EnableViewState”设置为false,然后将代码从if (!IsPostBack)部分移动到页面的Pre_Init事件中。我认为这将解决您的问题,也可能有助于您的回发更快。

答案 1 :(得分:1)

!IsPostBack不是你的问题,无论我是否喜欢这种模式。然而,回发事件处理程序是一团糟。

  1. 您通过连接字符串而不是使用参数来打开潜在的SQL注入漏洞。即使你必须编写一个sproc并传入一个逗号分隔列表,你也比你拥有的代码更好。
  2. 您的决策点是一个值是否设置为1或0,但您在决定运行两个字符串中的哪一个时分支代码(一个将始终创建,消耗周期,但从不运行)。
  3. 您正在创建两个命令对象,其中一个永远不会被使用。
  4. 通过使用各种测试用例逐步执行代码,您可以确定出错的地方。最终你会遇到触发问题的那个。

    更好的选择是将SQL更新代码分离到自己的例程中并发送参数。这将减少移动部件的数量。唯一应该在主事件处理程序中的东西(这可以说是争论)是从Grid中获取变量。

    如果是我,我还会考虑使用我的更新语句的键值,以免你在数据库中有两个James Smith,现在都处理了。

    至于候选人为什么会更新一些而不是其他人?很可能是因为某些原因你最终选错了所选的行。因为我没有你的代码副本来看到所有的渗透,我只能猜测。