如何使用LINQ使用SqlDataReader更新数据表?

时间:2015-08-18 18:40:27

标签: c# linq

我正在尝试使用C#合并来自两个单独查询的数据。数据位于不同的服务器上,或者我只是组合查询。我想更新第一个数据集的一列中的数据和第二个数据集的一列中的数据,并在另一列上连接。

这是我到目前为止所做的:

ds.Tables[3].Columns[2].ReadOnly = false;
List<object> table = new List<object>();
table = ds.Tables[3].AsEnumerable().Select(r => r[2] = reader.AsEnumerable().Where(s => r[3] == s[0])).ToList();      

ToList()仅用于调试。总而言之,ds.Tables[3].Rows[2]是我要更新的列。 ds.Tables[3].Rows[3]包含我要加入的密钥。

在阅读器中,第一列包含ds.Tables[3].Rows[3]的匹配键,第二列包含我要更新的数据ds.Tables[3].Rows[2]

我一直得到的错误是

  

无法投射'WhereEnumerableIterator 1[System.Data.IDataRecord]' to type 'System.IConvertible'.Couldn't store <System.Linq.Enumerable+WhereEnumerableIterator 1 [System.Data.IDataRecord]&gt;类型的对象在报价经销商栏目中。预期的类型是Int32。

我的LINQ在哪里出错?

编辑:

我更新了正在进行更新的行

table = ds.Tables[3].AsEnumerable().Select(r => r[2] = reader.AsEnumerable().First(s => r[3] == s[0])[1]).ToList();

但现在我一直在

  

序列不包含匹配元素

对于记录,序列确实包含匹配元素。

2 个答案:

答案 0 :(得分:1)

您可以使用以下示例来实现加入和更新操作。我们假设有两个数据表:

  

TBL1:   tbl1

     

TBL2:   tbl2

加入两个表并更新列&#34; name1&#34;的值列#34;名称2&#34;中的tbl1 of tbl2。

public DataTable JoinAndUpdate(DataTable tbl1, DataTable tbl2)
{
    // for demo purpose I have created a clone of tbl1.
    // you can define a custom schema, if needed.
    DataTable dtResult = tbl1.Clone();

    var result = from dataRows1 in tbl1.AsEnumerable()
                 join dataRows2 in tbl2.AsEnumerable()
                 on dataRows1.Field<int>("ID") equals dataRows2.Field<int>("ID") into lj
                 from reader in lj
                 select new object[]
                  {
                    dataRows1.Field<int>("ID"), // ID from table 1
                    reader.Field<string>("name2"), // Updated column value from table 2
                    dataRows1.Field<int>("age")
                    // .. here comes the rest of the fields from table 1.
                  };

    // Load the results in the table
    result.ToList().ForEach(row => dtResult.LoadDataRow(row, false));

    return dtResult;
}
  

结果如下:

resulting table after updation

答案 1 :(得分:0)

在考虑了@DStanley关于LINQ的内容之后,我放弃了它并使用了foreach语句。请参阅以下代码:

ds.Tables[3].Columns[2].ReadOnly = false;
while (reader.Read())
{
    foreach (DataRow item in ds.Tables[3].Rows)
    {
        if ((Guid)item[3] == reader.GetGuid(0))
        {
            item[2] = reader.GetInt32(1);
        }
    }
}