0

特定のセッションの出席の詳細を取得するフォームを作成しました。使用される要素は次のとおりです。

1 - CheckedListBox

2- コンボボックス:CB_Students

3- ボタン : 更新

私のテーブルは Student で、Code| が含まれています。名| 姓| 1日目| 2日目| 3日目| 4日目| Day5。Days は tinyint 型で、Presence または Absence を参照します。

ユーザーに CheckedListBox から生徒の名前を確認してもらいたいので、CheckedListBox に First Names と Last Names を連結して入力し、各項目に氏名を表示しました。

CheckedListBox はデータベース レコードによって間接的に作成されるため、データベースに直接接続することはできないと思われるため、CheckedListBox に表示される各学生に対応する Code の値を持つ非表示の ComboBox を作成しました。

たとえば、私の生徒のテーブルは次のとおりです。

コード | F_名前 | L_名前

1 | F1 | F1 | L1

2 | F2 | L2

CheckedListBox には F1 L1 と F2 L2 が含まれ、ComboBox には 1 と 2 が含まれます。

日付番号もフォームの読み込み中に検出され、Public 変数 Inquiry として保存されます。

以下は、更新ボタンの私のコードです。

Dim j, S As Integer
    sqlstr = "UPDATE Student SET Day'" & Inquiry & "'=@field1 WHERE Code='" & CB_Students.Items.Item(j) & "'"
    DBCmd = New MySql.Data.MySqlClient.MySqlCommand(sqlstr, DBConn)
    With DBCmd
        For j = 0 To CheckedListBox1.Items.Count - 1
            S = CheckedListBox1.GetItemCheckState(j)
            If S = 1 Then
                .Parameters.AddWithValue("@field1", 1)
            ElseIf S = 0 Then
                .Parameters.AddWithValue("@field1", 0)
            End If
        Next j
    End With
    DBCmd.ExecuteNonQuery()
    DBCmd.Dispose()

ただし、実行中に「パラメーター '@field1' は既に定義されています」というエラーが表示されます。

この問題にどう対処すればよいですか?また、ステートメント CB_Students.Items.Item(j) を正しく使用して、ComboBox の学生コードを SQL 文字列に指定していますか?

更新 1:

お問い合わせは整数です。次のコードも試しました。

 For j = 0 To CheckedListBox1.Items.Count - 1
        S = CheckedListBox1.GetItemCheckState(j)
        If S = 1 Then
            With DBCmd
                .Parameters.AddWithValue("@field1", 1)
                .ExecuteNonQuery()
                .Dispose()
            End With
        ElseIf S = 0 Then
            With DBCmd
                .Parameters.AddWithValue("@field1", 0)
                .ExecuteNonQuery()
                .Dispose()
            End With
        End If
    Next j

しかし、ここでも、Never_Mind への回答のように、DBCmd.ExecuteNonQuery() の最初の行で次のエラーが表示されます。 1行目のnear ''4' =1 WHERE Code='6''を使用してください。

値は正しいようです。Day number は 4、Field1 は 1、Code は 6 です。何が問題なのかわかりません。

更新 2:

以下は、フォーム ロード内にある CheckedListBox と ComboBox を設定するためのコードです。C_Code は Class Code で、student テーブルの別のフィールドです。ClassID は、前の形式で保存された公開整数変数です。このフォームは、.ShowDialog メソッドを使用して表示されます。

sqlstr = "SELECT * FROM Student WHERE C_Code = '" & ClassID & "'"
DBCmd = New MySql.Data.MySqlClient.MySqlCommand(sqlstr, DBConn)
DBDR = DBCmd.ExecuteReader
    While (DBDR.Read())
        Std_Name = DBDR("F_Name") & " " & DBDR("L_Name")
        CheckedListBox1.Items.Add(Std_Name)
        CB_Students.Items.Add(DBDR("Code"))
    End While
    DBCmd.Dispose()
    DBDR.Close()

また、コードは整数です。

更新 3:

Inquiry のデータ型を String に変更し、一重引用符を削除しました。

とにかく、別のフィールド番号を作成できないかと考えていました。このようなもの:

Dim j, S, k As Integer
    sqlstr = "UPDATE Student SET D" & Inquiry & " =@field" & k & " WHERE Code='" & CB_Students.Items.Item(j) & "' "
DBCmd = New MySql.Data.MySqlClient.MySqlCommand(sqlstr, DBConn)
For j = 0 To CheckedListBox1.Items.Count - 1
        For k = 1 To CheckedListBox1.Items.Count
            S = CheckedListBox1.GetItemCheckState(j)
            If S = 1 Then
                With DBCmd
                    .Parameters.AddWithValue("@field" & k, 1)
                    .ExecuteNonQuery()
                    .Dispose()
                End With
            ElseIf S = 0 Then
                With DBCmd
                    .Parameters.AddWithValue("@field" & k, 0)
                    .ExecuteNonQuery()
                    .Dispose()
                End With
            End If
        Next k
    Next j

しかし、これはうまくいきません。コマンドを使用して追加するときに @field と k を連結した方法に問題があるはずです。どうすれば動作させることができますか?

私は本当に助けていただければ幸いです!

4

3 に答える 3

0

Try this

 With DBCmd
        For j = 0 To CheckedListBox1.Items.Count - 1
            S = CheckedListBox1.GetItemCheckState(j)
            If S = 1 Then
                .Parameters.AddWithValue("@field1", 1)
 .ExecuteNonQuery()
            ElseIf S = 0 Then
                .Parameters.AddWithValue("@field1", 0)
 .ExecuteNonQuery()
            End If
        Next

    End With
于 2013-04-05T19:14:54.230 に答える
0

ちょうど答えを考え出した。@field1 を再作成することはできないため、SQL 文字列 (全体) をループに入れて再作成します。

For j = 0 To CheckedListBox1.Items.Count - 1
        S = CheckedListBox1.GetItemCheckState(j)
        sqlstr = "UPDATE Student SET D" & Inquiry & " =@field1 WHERE Code='" & CB_Students.Items.Item(j) & "' "
        DBCmd = New MySql.Data.MySqlClient.MySqlCommand(sqlstr, DBConn)
            If S = 1 Then
                With DBCmd
                .Parameters.AddWithValue("@field1", 1)
                    .ExecuteNonQuery()
                    .Dispose()
                End With
            ElseIf S = 0 Then
                With DBCmd
                .Parameters.AddWithValue("@field1", 0)
                    .ExecuteNonQuery()
                    .Dispose()
                End With
            End If
    Next j

これはかなり大変でした!でもね、解決したら楽になるでしょ?

于 2013-04-06T07:37:41.007 に答える