【问题标题】:VB6 map string to integer for headersVB6将字符串映射到标题的整数
【发布时间】:2015-04-20 03:47:32
【问题描述】:

我正在尝试将 CSV 文件解析为 VB6 应用程序,以便使用表单中已有的单个记录更新代码更新 SQL 表上的多个记录。 CSV 文件将有一个标题行,可用于验证进入 ADODB 记录集中正确位置的信息。在 C++ 中,您可以使用地图来表示喜欢

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

然后在逗号分隔的值之间创建一个计数器,如果第三个值是姓氏,则可以编写代码来更改 column 到 column 并且如果 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 将路径作为字符串返回

**************************************************** ******回答稍有变化 该集合按我的要求进行,但我确实必须将其更改为字典,因为您无法返回集合中的项目,这使我无法比较项目和更改键,但字典可以。确保如果您使用字典,则切换项目和键。

【问题讨论】:

  • 您选择使用VB6吗?我只是问,因为它是非常古老和过时的技术,使用 VB.Net 或 C# 会更容易(而且现代,所以无论你学习什么,将来都会更适用)。
  • 这不是我的选择,我必须为这个应用程序使用 VB6。我通常使用 C#

标签: sql csv vb6 containers adodb


【解决方案1】:

如果我正确理解您的问题,您正在尝试创建地图(C# 中的Dictionary&lt;string, int&gt;)。在 VB6 中,您可以为此目的使用 Collection - 它大致相当于 C# 的 Dictionary&lt;string, object&gt;。它使用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 中这样做。在单独的语句上声明和实例化对象,因为单语句形式会生成代码,其中检查 oObjNothing 并在每次使用前设置为实例。这会减慢您的代码(不必要的检查)并在您使用本应消失的实例时产生难以发现的错误。

总是这样做:

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 类型名称经常会产生误导。我的Here's an old answer 有更多细节(与您的问题不严格相关,但很有用)。

或者,您可以围绕 .NET Dictionary 类创建一个简化的包装器并将其公开为 COM 对象:这将允许您从 VB6 调用它。这可能会(有点)比Collection 慢,并且需要.NET Framework 才能运行您的VB6 项目。

编辑 2

正如@CMaster 评论的那样,Dictionary 可从Microsoft Scripting Runtime 库中获得——您需要添加对它的引用才能使用它(这就是我更喜欢Collection 的原因——它没有依赖关系)。 This answer 有详细的使用方法。

【讨论】:

  • 如果你想要一本VB6 中的字典,你可以得到一个比这更容易的。项目 -> 参考 -> Microsoft 脚本运行时。这使得字典类可供使用。
  • @CMaster 你是对的 - 我会用你的评论更新我的答案。我忘记了 Dictionary 类,因为 Collection 直接是 VB 的一部分,并且有许多更好的实现来快速替换集合。
  • @Davidp04 我很高兴它有用。
  • Vb6/COM 没有垃圾回收,而是使用引用计数器来管理对象生命周期。由于退出过程会自动销毁其中声明的变量,因此引用计数将确保对象被销毁。无需显式设置对 Nothing 的引用。
  • @MilanOparnica 确实如此,但仅当变量是函数的本地变量时才正确。如果一个变量是全局变量,它将一直存在直到进程存在,除非它在不再需要时被显式释放。 (适当的作用域/辅助类会对此有所帮助,但我已经看到了很多没有正确完成的示例。)此外,将变量设置为 Nothing 是减少引用计数的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多