如何使用 LinQ 更新数据表中单行中的单列



我正在做一个使用主数据库(数据表(来驱动从FTP服务器下载文件的项目。 在此过程中,我为 master 数据库中的每个客户端创建一个本地数据库(另一个数据表(。 以下是我用于创建客户端数据库的代码:

Console.WriteLine(" Building Client Database")
Clientdatabase = New DataTable
Clientdatabase = DataBaseTable.Clone
Dim RowList = (From row In DataBaseTable.AsEnumerable() Where (row.Field(Of String)("co") = CompanyID))
For Each RowItem In RowList
Clientdatabase.ImportRow(RowItem)
Next

此代码按预期工作;客户端数据库包含的内容是准确的。 我的问题是更新客户端数据库中的字段。 从循环中,我获取包含 FTP 服务器上目标文件的完整路径和文件名的每条记录,然后我尝试使用本地路径更新客户端数据库,但我无法让它工作。 从循环中,此代码正在执行逻辑并下载文件:

Dim FileList = (From row In DataBaseTable.AsEnumerable().Select(Function(x) New With {
Key .co = x.Field(Of String)("co"),
Key .path = x.Field(Of String)("path"),
Key .OriginalFileName = x.Field(Of String)("OriginalFileName"),
Key .DocumentID = x.Field(Of String)("DocumentID")
}).Where(Function(s) s.co = CompanyID).ToList)
Console.Write(" Downloading Files : ")
Dim CursorArray() As String = Split(",|,/,-", ",")
Dim FileCounter As Integer = 1
For Each CompanyFile In FileList
Dim ThisFile As String = CompanyFile.path.Replace("", "/")
Dim Results As TransferOperationResult = DownloadFromPath(ThisFile, DestinPath)
Dim TmpParts() As String = Split(ThisFile, "/")
Dim LocalName As String = TmpParts(UBound(TmpParts))
If Results.IsSuccess Then
UpdateCDBPath(CompanyID, CompanyFile.DocumentID, LocalName)
ReportData &= CompanyID & ",Success," & CompanyFile.OriginalFileName & "," & ThisFile & vbCrLf
Else
ReportData &= CompanyID & ",Failed," & CompanyFile.OriginalFileName & "," & ThisFile & vbCrLf
End If
FileCounter += 1
Console.Write(CursorArray(FileCounter Mod 4) & Chr(8))
Next

更新调用 (UpdateCDBPath( 包含以下代码:

Sub UpdateCDBPath(ByVal CompanyID As String, ByVal DocumentID As String, TargetValue As String)
Dim result = (From row In Clientdatabase.AsEnumerable().Select(Function(x) New With {
Key .DocumentID = x.Field(Of String)("DocumentID"),
Key .Co = x.Field(Of String)("co")
}).Where(Function(s) s.DocumentID = DocumentID And s.Co = CompanyID ) Select Clientdatabase)
For Each ItemRow In result
ItemRow.Rows(0).Item("Path") = TargetValue
Next
End Sub

问题出在此代码块中。 文档 ID 是在客户端中唯一标识文档的 GUID,目标值是替换路径(文件的本地路径(。 如果我正确理解了 Linq(而我不是(,它应该只返回我感兴趣的行 (1(,因此我是如何设置新路径的。 我已经从各种例子中尝试了无数的例子,但无法使其工作。当我检查客户端数据库时,没有更新任何路径字段。 我还确认在本地保存客户端数据库后,字段仍然相同。 有人可以指出我正确的方向,告诉我哪里出错了或其他什么,以便我解决这个问题。 我最终需要更新客户端数据库中的其他字段;这是第一个。 提前感谢我可能遇到的任何和所有帮助!

linq forresult返回一个EnumerableRowCollection(Of System.Data.DataTable),这意味着它包含整个Clientdatabase的行列表。

由于每一行都包含整个DataRowCollectionItemRow.Rows(0).Item("Path") = TargetValue将只更新第一行Clientdatabaseresults中的记录一样多。

更改查询以返回EnumerableRowCollection(Of System.Data.DataRow)允许在循环中直接访问每一行:

Sub UpdateCDBPath(ByVal CompanyID As String, ByVal DocumentID As String, TargetValue As String)
Dim result = From row In Clientdatabase.AsEnumerable()
Where row.Field(Of String)("DocumentID") = DocumentID AndAlso
row.Field(Of String)("co") = CompanyID
Select row
For Each ItemRow In result
ItemRow.Item("Path") = TargetValue
Next
End Sub

最新更新