vb.net访问数据库

时间:2013-02-09 21:57:29

标签: vb.net ms-access dao

我正在尝试将查询中的字段读入文本字符串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

2 个答案:

答案 0 :(得分:2)

此代码存在多个问题。除了杰里米提到的观点之外:

  1. VB6中Long的内容现在是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())(即字符串数组列表)将是合适的。列表具有自动增长的优势。

  6. 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