【问题标题】:DataTable updating some columns using primary keyDataTable 使用主键更新某些列
【发布时间】:2016-09-21 23:24:11
【问题描述】:

我在一个类中定义了一个数据表:

Public Shared Positions As DataTable

当我的主窗体加载时,我为 DataTable 创建结构,如下所示:

Function createTable()
    ' Function to create datatable structure
    Dim table As New DataTable

    ' Define primary key
    Dim keys(0) As DataColumn
    Dim keyColumn As New DataColumn()
    keyColumn.ColumnName = "hash"
    keys(0) = keyColumn

    ' Define columns
    table.Columns.Add(keyColumn)
    table.Columns.Add("PositionX", GetType(String))
    table.Columns.Add("PositionY", GetType(String))
    table.Columns.Add("PositionZ", GetType(String))

    return table
End Function

PositionX、PositionY 和 PositionZ 的值随时间变化,我想使用作为主键的 hash 值在 DataTable 中更新它们。

但是,我似乎无法正确使用语法。这篇文章 (https://msdn.microsoft.com/en-us/library/tat996zc.aspx) 表明这种方法可行:

Dim customerRow() As Data.DataRow
customerRow = DataSet1.Tables("Customers").Select("CustomerID = 'ALFKI'")

customerRow(0)("CompanyName") = "Updated Company Name"
customerRow(0)("City") = "Seattle"

但是将它应用到我的代码中:

' Get the row containing this object
Dim resultRow() As Globals.Positions.DataRow
resultRow= Globals.Positions.Tables("Positions").Select("hash = '44DE43AB'")

resultRow(0)("PositionX") = 123456789
resultRow(0)("PositionY") = 123456789

在前两行给出错误“Globals.Positions.DataRow not defined”和“Tables is not a member of DataTable”。

我需要做什么才能获得包含我正在查找的主键值的行,以便我可以更新某些列值?

【问题讨论】:

  • 这些东西会进入数据库吗?那里有很多问题。
  • 不,这只是为了保存我在内存中跟踪的对象的位置。当我与他们失去联系时,他们会在一段时间后被删除。
  • a) 在 Option Strict 下无法编译 - 该函数没有返回类型 b) 如果 X Y 和 Z 是数字,列不应该是字符串 c) 我们看不到 Globals.Positions.DataRow 定义,但由于 DataRow 是一种类型,我怀疑你的意思是别的 d) A DataTable 不包含 Tables 所以第二个与 (c) 大致相同
  • 谢谢。 a)我该如何添加类型?由于每一列都有一个类型,我需要一个表吗? b) 是的,X、Y 和 Z 可能是数字类型,c & d) 我在上面链接的示例中工作,试图调整该示例中的代码到目前为止没有成功
  • PS 我正在尝试使用主键以避免遍历 DataTable 中的所有行,因为速度在此应用程序中至关重要。

标签: vb.net datatable


【解决方案1】:

也许在DataTable的类中有一个属性,设置它,加载数据。有一种方法可以在一行中查找和设置值,例如

Public Class Demo1
    Public Property DataTable As DataTable
    ''' <summary>
    ''' Fire off create and load tabe
    ''' </summary>
    Public Sub New()
        CreateTable()
        LoadData()
    End Sub
    Public Sub CreateTable()
        DataTable = New DataTable
        DataTable.Columns.Add(New DataColumn With {.ColumnName = "hash", .DataType = GetType(String)})
        DataTable.Columns.Add(New DataColumn With {.ColumnName = "PositionX", .DataType = GetType(String)})
        DataTable.PrimaryKey = New DataColumn() {DataTable.Columns("hash")}

    End Sub
    Public Sub LoadData()
        DataTable.Rows.Add(New Object() {"22DE43AS"})
        DataTable.Rows.Add(New Object() {"44DE43AB"})
        DataTable.Rows.Add(New Object() {"33DE43AW"})
    End Sub
    ''' <summary>
    ''' Simple demo to find and update a row
    ''' </summary>
    ''' <param name="hash"></param>
    ''' <param name="PositionX"></param>
    ''' <returns></returns>
    Public Function SetItem(ByVal hash As String, PositionX As String) As Boolean
        Dim result As DataRow() = DataTable.Select($"hash = '{hash}'")
        If result.Count > 0 Then
            result.First.SetField(Of String)("PositionX", PositionX)
            Return True
        Else
            Return False
        End If
    End Function
End Class

演示

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim demo As New Demo1
    If demo.SetItem("44DE43AB", "new value") Then
        MessageBox.Show("Success")
    Else
        MessageBox.Show("Failed")
    End If
End Sub

【讨论】:

  • 太好了,凯伦,你的例子正是我所需要的。我已经重写了我的代码以允许我添加、更新和删除项目,它似乎正在工作。我只需要弄清楚如何从数据表中提取所有数据的列表。再次感谢您!
【解决方案2】:

您可以改用Dictionary

Class Point3D
    Public X, Y, Z As Integer
End Class

Sub test()
    Dim Positions As New Dictionary(Of String, Point3D)         ' create
    Positions("44DE43AB") = New Point3D With {.X = 1, .Y = 2}   ' add
    Positions("44DE43AB").Z = 3                                 ' edit
    Positions.Remove("44DE43AB")                                ' remove
End Sub

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多