0

クエリからテキスト文字列配列にフィールドを読み込もうとしています。vb6 では、単純に配列を宣言してから、その中にある値の型を気にせずにフィールドを読み込むことができます。同じことをしようとすると、「「dao.fieldclass」型の com オブジェクトを「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. 常に同じ配列フィールドに追加しています。あなたが何を考えているのか正確にはわかりません。1 つのフィールドのみを追加する場合は、List(Of String). 各レコードに複数のフィールドを追加する場合は、a 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 では、このようなファイルに書き込むことができます (.NET のようなものではない fso を使用せずに)。

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) レコードセットを開く方法を表示しません。たとえば、次のようになります。

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
于 2013-02-09T22:28:28.870 に答える