2013-02-09 110 views
0

我想从一个查询中读取字段arrary的文本字符串。在vb6中,我可以简单地声明该数组,然后将其读入该数组中,而不必关心数组中的类型值。现在,当我尝试做同样的事情时,我得到一个“无法投射类型为”dao.fieldclass“的com对象来键入”system.string“。我是否需要将字段值读入seperarte变量,然后将其转换为字符串?该seqNum就是我有vb.net访问数据库

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

你似乎是写一个记录到一个文本文件,你需要通过记录来做这个记录? – Fionnuala 2013-02-09 22:05:42

+0

是的,我正在通过记录读取记录以写入文本文件,这需要这样做,因为我将执行一些将取决于以前的记录包含的计算 – 2013-02-10 02:46:26

+0

不客气。此外,由于您是StackOverflow的新用户,因此我想告诉您,您可以通过查看答案旁边的勾号来获得最佳答案并接受最能帮助您的答案。在这个网站上upvote或接受的答案算作“谢谢”。 – 2013-02-12 14:08:16

回答

1

1)你不要的问题,告诉你如何打开记录,如:

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

2)你没有一个.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 
2

你有几个问题与此代码。除了由杰里米提到的几点:

  1. 什么Long在VB6现在在VB.NET IntegerLong现在是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 
+0

谢谢,这是非常有用的,我特别喜欢你如何给我具体的代码,但是如果我想通读一个已经存在于我的数据库中的查询,那么我不必在我的SQL中写入SQL码? – 2013-02-12 05:27:24

+0

尝试'SELECT * FROM myQuery' – 2013-02-12 14:06:13