DataTable修改后的行计数在适配器填充后恢复为0

时间:2012-09-03 10:13:48

标签: c# ado.net datatable

道歉,如果这是一个愚蠢的错误 - 但几周来一直在努力,我不会再继续。

问题是 - 我从基于DT的DS到SQL Db的更新调用只是插入nerw记录,而不是更新修改后的记录。

我有一个数据源(httpWebRequested html表),我定期调用它并使用它更新属于DataSet的DataTable。最初我将它全部解析为第二个DataTable并将其与我的DataSet表合并 - 但这不起作用,所以目前我只有一个DataTable,要么在表中插入新行,要么通过遍历源并在以下处添加行来更新现有值一个数组的时间 - 检查当前行的存在,更新或插入([Session ID]是PK,Data [0]是相应的唯一值): -

                foreach (var row in rows.Skip(1))
            {
                //create new list collection
                var data = new List<string>();
                //interate through rows
                foreach (var column in row.Descendants("td"))
                {
                    //add data to list from Table
                    data.Add(column.InnerText);
                }
                    string strSelect = "[Session ID] = '"+ data[0] +"'";
                    DataRow[] myRow = dt.Select(strSelect);
                    if (myRow.Length == 1)
                    {
                        if (myRow[0][2].ToString() != data[2].ToString())
                        {
                            myRow[0][2] = data[2];
                        }
                        if (myRow[0][3].ToString() != data[3].ToString())
                        {
                            myRow[0][3] = data[3];
                        }
                        if (myRow[0][4].ToString() != data[4].ToString())
                        {
                            myRow[0][4] = data[4];
                        }
                        if (myRow[0][5].ToString() != data[5].ToString())
                        {
                            myRow[0][5] = data[5];
                        }
                        if (myRow[0][7].ToString() != data[7].ToString())
                        {
                            myRow[0][7] = data[7];
                        }
                    }
                    else
                    {
                        dt.Rows.Add(data.ToArray());
                    }

我在最后还添加了一些计算添加和修改的内容: -

            int modified= 0;
            int added = 0;
            foreach (DataRow dr in pca.chatDataSetG.Tables[0].Rows)
            {
                if (dr.RowState == DataRowState.Modified)
                {
                    modified++;
                }
                if (dr.RowState == DataRowState.Added)
                {
                    added++;
                }
            }

此时 - 计数很好 - 修改后选择属性已更改并添加的行是正确的。

当我调用我的更新Db方法时 - 事情开始出错: -

    public static void updateSqlTable()
    {

        string connectionString = "Connection String here";
        string qry = @"select * from chatData";

        SqlConnection conn = new SqlConnection(connectionString);

        try
        {
            SqlDataAdapter da = new SqlDataAdapter(qry, conn);
            SqlCommandBuilder sb = new SqlCommandBuilder(da);
            log.Info("Building Queries...");
            da.UpdateCommand = sb.GetUpdateCommand();
            da.InsertCommand = sb.GetInsertCommand();
            da.DeleteCommand = sb.GetDeleteCommand();

            log.Info("Filling Data into Adapter...");
            int modified = 0;
            int added = 0;
            foreach (DataRow dr in pca.chatDataSetG.Tables[0].Rows)
            {
                if (dr.RowState == DataRowState.Modified)
                {
                    modified++;
                }
                if (dr.RowState == DataRowState.Added)
                {
                    added++;
                }
            }
            //This is where the modified count reverts
            da.Fill(pca.chatDataSetG, "Chat");
            modified = 0;
            added = 0;
            foreach (DataRow dr in pca.chatDataSetG.Tables[0].Rows)
            {
                if (dr.RowState == DataRowState.Modified)
                {
                    modified ++;
                }
                if (dr.RowState == DataRowState.Added)
                {
                    added++;
                }
            }
            conn.Open();
            log.Info("Calling Update to DB...");
            int rowseffected = da.Update(pca.chatDataSetG, "Chat");
            log.Info("Update Complete - " + rowseffected + " rows effected........");

        }
        catch (Exception ex)
        {
            log.Error("Error Updating Db with chat Data", ex);
        }
        finally
        {
            conn.Close();
        }

    }

计数在填充之前是正确的,但之后 - 添加的计数保持不变 - 很好,但修改后的计数变为0 - 糟糕:(。我已尝试所有形状试图看看这里发生了什么 - 但老实说 - 我很难过。任何帮助都会非常,非常非常感激.Db中的行不会反映出新的价值。

彼得

1 个答案:

答案 0 :(得分:0)

您可以在此行代码中重新填充DataSet / Tables

//This is where the modified count reverts
da.Fill(pca.chatDataSetG, "Chat");

在MSDN DataAdapter填充中,我认为对所描述的行为有一个解释

  

您可以在同一个DataTable上使用多次填充方法。如果一个   存在主键,传入的行与匹配的行合并   已经存在。 如果不存在主键,则会追加传入的行   DataTable

IMO修改的行与db拥有的origianl合并,因此松散了它的rowState,插入的项目按照描述附加了。