VB6将字符串映射到整数以用于标题

4

我正在尝试在VB6应用程序中解析CSV文件,以便使用已经存在于表单中的单个记录更新代码来更新SQL上的多个记录。CSV文件将有一个标题行,可以用来验证信息是否放置到ADODB记录集的正确位置。在C++中,你可以使用map来说明...

map<String s, int x> column 
 column<"First Name", -1>
 column<"Last Name",-1>

然后,在逗号分隔的值之间创建一个计数器,如果第三个值是“Last Name”,则可以编写代码将列<"Last Name",-1>更改为列<"Last Name",3>,如果在任何地图中x != -1,则该文件可用于使用,然后我会循环遍历剩余记录并使用类似于以下内容的东西解析到容器中:

strLastName = Array<column[3]>

将记录值分配给正确的变量。我对VB6还很陌生,我该如何在VB6中实现类似的操作,应该使用哪些容器?到目前为止,我已经有了:

Public Sub GetImportValues()
On Error GoTo GetImportValues_Error:
Dim intFileNum As Integer

Open Path For Input As #intFileNum

Do Until EOF(intFileNum)

Line Input #intFileNum, vbCrLf

FunctionThatSavesInformationToSQL

Loop

Close #intFileNum



GetImportValues_Exit:
    Exit Sub

GetImportValues_Error:
    Err.Source = "frmMemberAdd.GetImportValues" & " | " & Err.Source
    Err.Raise Err.Number, Err.Source, Err.Description
End Sub

使用一个对话框返回路径字符串,使用App.path在一个单独的函数中。
*****************************************************稍作修改 这个集合对我所要求的东西很有帮助,但我必须将其更改为字典,因为你不能在集合上返回项目,这使我无法比较项目并更改键,但是字典可以。如果使用字典,请确保切换项目和键。

1
你选择使用VB6吗?我只是问一下,因为它是非常古老和过时的技术,使用VB.Net或C#会更容易(而且现代化,所以你学到的东西将来更有用)。 - xxbbcc
这不是我的选择,我必须使用VB6来开发这个应用程序。通常我使用C#。 - Davidp04
1个回答

4
如果我正确理解了你的问题,你是想创建一个地图(在C#中是Dictionary<string, int>)。在VB6中,你可以使用Collection来实现这个目的 - 它大致相当于C#的Dictionary<string, object>。它使用String键,并将所有值存储为Variant。例如:
Dim oColl As Collection

Set oColl = New Collection
oColl.Add -1, "ColumnName"

Dim nColumnIndex As Long

'Get column index for column name.
nColumnIndex = oColl.Item("ColumnName")

If nColumnIndex = -1 Then
    nColumnIndex = ...

    'When you want to update a column index in the collection, you
    'first have to remove the item and then add it back with the right
    'index.
    oColl.Remove "ColumnName"
    oColl.Add nColumnIndex, "ColumnName"
End If

编辑1:

关于VB6,有一个警告:你会看到很多示例都这样做:

Dim oObj As New SomeClass

在VB.Net中这样做是可以的,但绝不要在VB6中这样做。声明和实例化对象应分开进行,因为单语句形式生成的代码会在每次使用之前检查oObj是否为Nothing并设置一个实例。这会减慢您的代码(不必要的检查)并创建难以找到的错误,如果您正在使用应该消失的实例。

始终使用以下方法:

Dim oObj As SomeClass
Set oObj = New SomeClass
...

'Clean up the object when you're done with it. Remember, there's
'no garbage collection in COM / VB6, you have to manage object
'lifetimes.
Set oObj = Nothing

此外,尽可能使用Long而不是Integer - Long是32位整数,而Integer只有16位。VB6类型名称经常会误导人。这里是我以前的一个答案,其中包含更多详细信息(与您的问题不严格相关但有用)。链接 或者,您可以创建一个简化的包装器,将.NET Dictionary类公开为COM对象:这将允许您从VB6调用它。这可能比Collection慢一些,并且需要.NET框架才能运行您的VB6项目。 编辑2: 如@CMaster所评论的那样,Dictionary可从Microsoft Scripting Runtime库中获得 - 您需要添加对其的引用才能使用它(这就是为什么我更喜欢Collection - 它没有依赖项)。这个答案中有关于如何使用它的详细信息。链接

1
如果你想在VB6中使用字典,可以更容易地获得一个。 项目 -> 引用 -> Microsoft Scripting Runtime。 这将使字典类可用于使用。 - CMaster
@CMaster 你说得对 - 我会在我的回答中加入你的评论。我忘记了字典类,因为集合是VB的一部分,而且有许多更好的实现可以快速替换集合。 - xxbbcc
@Davidp04 很高兴它对你有帮助。 - xxbbcc
Vb6/COM没有垃圾回收机制,而是使用引用计数器来管理对象的生命周期。由于退出过程会自动销毁其中声明的变量,因此引用计数将确保对象被销毁。无需显式设置引用为 Nothing。 - Milan Oparnica
@MilanOparnica 这是正确的,但仅适用于变量局部于函数的情况。如果一个变量是全局的,它将一直存在,直到进程结束,除非在不再需要时显式释放它。(适当的作用域/辅助类可以帮助解决这个问题,但我见过许多没有做对的例子。)此外,将变量设置为“Nothing”会减少引用计数。 - xxbbcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接