如果这是一个愚蠢的错误,我深表歉意,但我已经为此挣扎了几周,我不再继续了。
问题是,我从基于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中的行没有反映新的值。
Peter
您可以在的这一行代码中重新填充数据集/表
//This is where the modified count reverts
da.Fill(pca.chatDataSetG, "Chat");
在MSDN DataAdapter填充中,我认为描述的行为有一个解释
您可以在同一个DataTable上多次使用Fill方法。如果主键存在,传入行与匹配行合并已经存在如果不存在主键,则传入行将附加到数据表。
IMO修改的行与数据库中的原始所有者合并,因此释放了其rowState,其中插入的项如所述被附加。