【问题标题】:DataTable Seems To Lose DataDataTable 似乎丢失了数据
【发布时间】:2018-07-13 02:15:27
【问题描述】:

当我认为我正在向它添加列时,我是否覆盖了数据表?我知道,如果我在 _FinishButton() 事件中写入输出窗口,我的结果就在那里,但是当我在 pushdatatosql() 方法中写入输出时,它是空的。我将 Datatable 声明为类变量。

我在这里写错了什么?

DataTable dtResult = new DataTable();

protected void FinishBtn_Click(object sender, EventArgs e)
{
    pushdatatosql();
}

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
    DataRow dr = null;
    dtResult.Columns.Add(new DataColumn("mainevent", typeof(string)));
    dtResult.Columns.Add(new DataColumn("secondevent", typeof(string)));

    foreach (GridViewRow gr in grdOther.Rows)
    {
        dr = dtResult.NewRow();
        TextBox box1 = (TextBox)gr.Cells[1].FindControl("txtmainevent");
        TextBox box2 = (TextBox)gr.Cells[2].FindControl("txtse");

        dr["mainevent"] = box1.Text;
        dr["secondevent"] = box2.Text;

        dtResult.Rows.Add(dr);
    }
}


protected void pushdatatosql()
{
    foreach (DataRow dataRow in dtResult.Rows)
    {
        foreach (var item in dataRow.ItemArray)
        {
            System.Diagnostics.Debug.WriteLine(item);
        }
    }

    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLString"].ConnectionString))
    {
        connection.Open();
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
        {
            foreach (DataColumn c in dtResult.Columns)
                bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);

            bulkCopy.DestinationTableName = "TestInsertTable";
                bulkCopy.WriteToServer(dtResult);
        }
    }
}

【问题讨论】:

  • @mason - 你会如何推荐我这样做?
  • 暂缓我之前关于不使用 DataTables 的声明。我向下滚动,看到您正在使用 SqlBulkCopy。这是 DataTables 的合法用途。

标签: c# asp.net datatable webforms


【解决方案1】:

您引用的dtResult 类变量仅持续请求的时间。因此,对于您在页面中进行的每个回发,都会创建此类的新实例和该类成员。在 Webforms 中,“在页面完全呈现、发送到客户端并准备好丢弃后引发 Unload 事件。”MSDN。此时,您的类变量连同它所拥有的任何值都被销毁了。

要解决此问题,您可以尝试将值存储在视图状态中。哪个persists across requests

【讨论】:

  • 所以在 winforms 中这是完全可以接受的,但由于这是 webforms 我必须使用视图状态?
  • 正确,Windows 窗体中的生命周期允许您将值存储在跨事件持续存在的类中。因为 Webforms 是 Web 应用程序,所以工作方式不同。
  • 视图状态或会话变量是保存数据表的最佳选择吗?
  • @BoJackHorseman 您不需要使用 ViewState,您可以使用 Session、数据库或任何持久性机制。
  • @Crowcoder 这些也可以。有很多方法可以解决这个问题。几乎每个新的 WebForms 开发人员都会遇到一个陷阱
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多