特定のセッションの出席の詳細を取得するフォームを作成しました。使用される要素は次のとおりです。
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 を連結した方法に問題があるはずです。どうすれば動作させることができますか?
私は本当に助けていただければ幸いです!