これがばかげたエラーである場合は申し訳ありませんが、これに数週間苦労しており、これ以上先に進むことはできません.
問題は、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 の行は新しい値を反映していません。
ピーター