【问题标题】:Database update only works SOME of the time [duplicate]数据库更新仅在某些时候有效[重复]
【发布时间】:2011-07-13 02:50:41
【问题描述】:

可能重复:
Data not writing out to Database

我正在尝试在复选框的 checkchanged 事件上更新我的数据库中的位字段。当它被选中时,它发送一个 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();
    }

【问题讨论】:

  • 查看每个CheckedChanged 上的checkedStringuncheckedString。比较从更新“不起作用”到何时更新的 SQL。
  • 这不是重复的,这一次它肯定是写入数据库的——只是不是一直。以前,我什至无法将它存放起来。这真的被认为是一个重复的问题吗?
  • 另外,代码也有非常细微的差别。
  • 这是同一个本地问题的一部分。

标签: c# asp.net sql database bit


【解决方案1】:

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

【讨论】:

  • 嗯,它的功能基本相同。这里有其他东西 - 有时当我选中一个复选框时,它会在页面上绘制另一个文本框。
【解决方案2】:

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

  1. 您通过连接字符串而不是使用参数来打开一个潜在的 SQL 注入漏洞。即使您必须编写一个 sproc 并传入一个逗号分隔的列表,您也比您拥有的代码要好。
  2. 无论值设置为 1 还是 0,您的决策点都是一个,但您在决定要运行两个字符串中的哪一个时分支代码(始终会创建一个,消耗周期,但从不运行)。
  3. 您正在创建两个命令对象,其中一个永远不会被使用。

您可以通过使用各种测试用例单步执行代码来确定哪里出了问题。最终,您会遇到触发您遇到的问题的那个。

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

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

至于候选人,为什么它有时会更新而不是其他时候?很可能是由于某种原因您最终选择了错误的行。由于我没有您的代码副本来查看所有渗透,我只能猜测。

【讨论】:

  • 1.我认识到这个问题,我对这一切都很陌生,而且由于这段代码不会被其他人看到,所以暂时没问题。 3. 我知道我的一个命令对象没有被使用,有人因为我把我的 cmets 留在我的代码中而生气,所以我把它拿出来了。我会考虑你所说的一切,看看我是否能偶然发现一些东西。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2012-02-11
  • 2015-10-04
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多