0
Private Sub aTbBar_Change()
    Set con = New ADODB.Connection
    With con
        .CursorLocation = adUseClient
        .ConnectionString = "Provider=Microsoft.jet.oledb.4.0;persist security info=false;data source=" & App.Path & "\Event_Participants.accde"
        .Open
    End With


    Set rs = New ADODB.Recordset
    With rs
        Set .ActiveConnection = con
        .CursorType = adOpenDynamic
        .Source = "select * from Participants"
        .Open


        'check from table if user and pwd matches
        If rs.RecordCount <> 0 Then
            rs.MoveFirst
            While Not rs.EOF
                If rs!Bar_Code_No = Val(Me.aTbBar) Then
                    Me.aTbName = rs!Full_Name
                    Me.aTbSection = rs!Section
                    Me.aTbArrtime = Time()
                End If
                rs.MoveNext
            Wend
        End If

        .Close
        Set rs = Nothing

    End With

    'save to the database
    'check from table if user and pwd matches

    Set rs = New ADODB.Recordset
    With rs
        Set .ActiveConnection = con
        .CursorType = adOpenDynamic
        .LockType = adLockOptimistic
        .Source = "select * from Participants"
        .Open


        If rs.RecordCount <> 0 Then
            rs.MoveFirst
            While Not rs.EOF
                If rs!Bar_Code_No = Val(Me.aTbBar) Then
                    .Update
                    rs!Arr_Time = Me.aTbArrtime
                End If
                rs.MoveNext
            Wend
        End If

    End With

    rs.Close
    Set rs = Nothing

End Sub

そのテキストボックス名 aTbBar に入力すると、適切なエラーの無効な使用が常に発生する エラーは、Me.aTbName = rs!Full_Name で発生します。これについて私を助けてもらえますか。申し訳ありませんが、このフォーラムと VB は初めてです。私は本当に助けが必要です

4

1 に答える 1

0

TextBox に対してトリガーされる既定のプロパティは、Textプロパティです。したがって、名前が の TextBox がある場合Text1、次のステートメント:Text1 = "Hello"は と同等になりText1.Text = "Hello"ます。しかし、アクセスするときは、コントロール名とともにプロパティ名を使用することを常に好みます(つまり、Text1.Text = "Hello")。

とにかく、次の行を使用してテストしてください。Me.aTbArrtime.text = rs!Full_Name

私が念頭に置いているもう1つのことは、他のコンポーネントを使用している場合、たとえばカスタムメイドのTextBoxコントロール(デフォルトのコントロールではなく)を使用している場合、ロードに失敗した場合、VBがコントロール(カスタムメイドのテキストボックス)を置き換えることです。フォームに PictureBox を使用します。それを確認するには、フォームの TextBox をクリックして、そのプロパティを表示します。コントロールの型が TextBox かどうかを確認します。PictureBox の場合は、カスタム メイドのテキスト ボックス用の OCX または DLL がプロジェクトに存在するかどうかを再確認します。

SQL コードに関する小さな提案は、すべてのレコードをループする代わりに、クエリ自体に比較を含めることができたということです。例えば:

.Source = "select * from Participants WHERE Bar_Code_No = " & Val(Me.aTbBar.Text) & " LIMIT 1"

に一致する場合、これは単一のレコードを返しBar_Code_Noます。このクエリを実行した後、レコードが返されるかどうかを確認するだけで済みます。その場合、一致が見つかります。それ以外の場合、一致は見つかりません。Participantsこのようにして、テーブル内のレコード数が非常に多い場合にプログラムが応答しなくなる可能性があるループを回避できます。

これがお役に立てば幸いです。幸運を願っています :)

于 2012-09-02T05:31:03.103 に答える