0

我正在尝试将查询中的字段读入文本字符串数组。在 vb6 中,我可以简单地声明数组,然后将字段读入其中,而无需关心其中包含什么类型的值。现在,当我尝试做同样的事情时,我得到一个"unable to cast com object of type 'dao.fieldclass' to type 'system.string"。我是否需要将字段值读入单独的变量,然后将其转换为字符串?这seqNum就是我遇到的问题

Public dbEngine As dao.DBEngine
Public db As dao.Database, recSet As dao.Recordset
dbEngine = New dao.DBEngine
Dim seqNum As Long
scExportTemplatePath = "M:\robot\scTemplates\"
db = dbEngine.OpenDatabase(scExportStuffPath & "scExport.mdb")
tsOut = fso.CreateTextFile(wildePath & dte & "-" & fle.Name & ".csv", True)
With recSet
    .MoveFirst()
    Do While Not .EOF
        seg = .Fields("segmentID")
        If seg <> segHold Then
            seqNum = 1
        End If
        arrOut(0) = .Fields("jobnum_AM")
    Loop
End With
4

2 回答 2

2

这段代码有几个问题。除了杰里米提到的几点:

  1. LongVB6 中的内容现在在IntegerVB.NET 中。Long现在是 64 位整数。

  2. 用于System.IO.Path.Combine组合路径字符串。Combine自动添加缺少的反斜杠并删除多余的反斜杠。Path.Combine(scExportTemplatePath, "scExport.mdb")

  3. Field属性不再具有默认属性。非索引属性永远不是 VB.NET 中的默认属性。使用 获取字段值.Fields("segmentID").Value

  4. 将其值转换为适当的类型:seg = Convert.ToInt32(.Fields("segmentID").Value)
    注意:VB 的Integer类型只是System.Int32.

  5. 您总是添加到同一个数组字段。我不知道你到底在想什么。如果您只想添加一个字段,则可以使用List(Of String). 如果您为每条记录添加多个字段,那么List(Of String())(即字符串数组列表)将是合适的。列表具有自动增长的优势。

Dim list As New List(Of String())
Do While Not .EOF
    Dim values = New String(2) {}
    values(0) = Convert.ToString(.Fields("field_A").Value)
    values(1) = Convert.ToString(.Fields("field_B").Value)
    values(2) = Convert.ToString(.Fields("field_C").Value)
    list.Add(values)
    recSet.MoveNext()
Loop

但是,如果您创建一个自定义类来存储字段值,则更容易理解:

Console.WriteLine("{0} {1} ({2})", user.FirstName, user.LastName, user.DateOfBirth)

...读起来比:

Console.WriteLine("{0} {1} ({2})", values(0), values(1), values(2))

在 VB.NET 中,您还有其他使用数据库的可能性:

Dim list As New List(Of String())
Using conn = New OleDb.OleDbConnection( _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyPath\MyDb.mdb")
    Dim sql = "SELECT myStuff FROM myTable"
    Dim command = New OleDbCommand(sql, conn)
    conn.Open()
    Using reader As OleDbDataReader = command.ExecuteReader()
        While reader.Read()
            Dim values = New String(reader.FieldCount - 1) {}
            For i = 0 To reader.FieldCount - 1
                values(i) = Convert.ToString(reader.GetValue(i))
            Next
            list.Add(values)
        End While
    End Using
End Using

请注意,该Using语句最后会自动关闭资源。即使发生错误并且代码过早终止。


在 VB.NET 中,您可以写入这样的文件(不使用 fso,它不像 .NET)

Using writer As New StreamWriter("myFile.txt", False)
    writer.WriteLine("line 1")
    writer.WriteLine("line 2")
    writer.WriteLine("line 3")
End Using
于 2013-02-09T23:05:41.963 回答
1

1) You dont show how you open the Recordset, eg:

Set recSet = db.OpenRecordset("query_name or SQL")

2) You dont have a .MoveNext in the While Loop:

With recSet
 .MoveFirst()
  Do While Not .EOF
  seg = .Fields("segmentID")
    If seg <> segHold Then
     seqNum = 1
    End If
    arrOut(0) = .Fields("jobnum_AM")
    .MoveNext()
  loop
于 2013-02-09T22:28:28.870 回答