0

これがばかげたエラーである場合は申し訳ありませんが、これに数週間苦労しており、これ以上先に進むことはできません.

問題は、DT ベースの DS から SQL Db への update 呼び出しが新しいレコードを挿入するだけで、変更されたレコードを更新しないことです。

私は定期的に呼び出すデータソース (httpWebRequested html テーブル) を持っており、DataSet に属する DataTable を更新します。最初はすべてを 2 番目の DataTable に解析し、DataSet テーブルとマージしましたが、これは機能していませんでした。現在、DataTable は 1 つしかなく、新しい行をテーブルに挿入するか、ソースを反復して行を追加することで既存の値を更新します。配列への時間 - 現在の行の存在を確認し、更新または挿入します ([セッション ID] は PK であり、データ [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++;
                }
            }

この時点で - カウントは問題ありません - 属性が変更され、追加された行を修正して選択することは正しいです。

update 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 の行は新しい値を反映していません。

ピーター

4

1 に答える 1

0

このコード行で DataSet/Tables を再入力します

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

MSDN DataAdapter fill 内で、説明されている動作について説明があると思います

同じ DataTable でFill メソッドを複数回使用できます。主キーが存在する場合 、着信行は既存の一致する行とマージされます。主キーが存在しない場合、受信行は DataTable に追加されます

IMO で変更された行は、データベースからの元の所有物とマージされたため、rowState が失われましたが、挿入されたアイテムは説明どおりに追加されました。

于 2012-09-03T11:35:45.700 に答える