我正在尝试将查询中的字段读入文本字符串arrary。在vb6中,我可以简单地声明数组,然后将字段读入其中,而不关心它中包含哪种类型的值。现在,当我尝试做同样的事情时,我得到一个“无法将'dao.fieldclass'类型的com对象转换为'system.string'。我是否需要将字段值读入seperarte变量然后将其转换为字符串? 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
答案 0 :(得分:2)
此代码存在多个问题。除了杰里米提到的观点之外:
VB6中Long
的内容现在是VB.NET中的Integer
。 Long
现在是64位整数。
使用System.IO.Path.Combine
组合路径字符串。 Combine
会自动添加缺少的反斜杠并删除多余的反斜杠。 Path.Combine(scExportTemplatePath, "scExport.mdb")
Field
属性不再具有默认属性。非索引属性永远不是VB.NET中的默认属性。使用.Fields("segmentID").Value
获取字段值。
将其值转换为适当的类型:seg = Convert.ToInt32(.Fields("segmentID").Value)
注意:VB的Integer
类型只是System.Int32
的别名。
您总是添加到同一个数组字段。我不知道你到底在想什么。如果您只想添加一个字段,则可以使用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
答案 1 :(得分:1)
1)你没有显示你如何打开Recordset,例如:
Set recSet = db.OpenRecordset("query_name or SQL")
2)你在While循环中没有.MoveNext:
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