0

我已经制作了一个表格,该表格应该获取特定会话的出勤详细信息。使用的元素是:

1-选中列表框

2-组合框:CB_Students

3- 按钮:更新

我的表是学生,其中包含代码| 名字| 姓氏| 第1天| 第2天| 第3天| 第4天| Day5,其中 Days 的类型为 tinyint,指的是存在或缺席。

我希望用户从 CheckedListBox 中检查学生的姓名,因此我在 CheckedListBox 中填充了名字和姓氏的串联,每个项目都显示全名。

由于 CheckedListBox 是由数据库记录间接创建的,我想我无法将其直接连接到数据库,因此我创建了一个隐藏的 ComboBox,其 Code 值对应于 CheckedListBox 中显示的每个学生。

例如,我的学生表如下:

代码 | F_Name | L_名称

1 | F1 | L1

2 | F2 | L2

CheckedListBox 包含:F1 L1 和 F2 L2,ComboBox 包含 1 和 2。

在表单加载期间也可以找到天数并保存为公共变量 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) 是否正确用于为我的 sql 字符串提供 ComboBox 中的学生代码?

更新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() 收到以下错误:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以获取正确的语法在第 1 行的 ''4' =1 WHERE Code='6'' 附近使用。

这些值似乎是正确的。Day number 是 4,Field1 是 1,Code 是 6。我不明白问题出在哪里。

更新 2:

下面是在表单加载中填充 CheckedListBox 和 ComboBox 的代码。C_Code 是班级代码,学生表中的另一个字段。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

试试这个

 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

首先从字符串 Inquiry 中删除单引号,以将字段的渐进式连接到单词 day。当心。我想您可以完全控制 Inquiry 变量的值,并在连接到 Day 字之前检查它是否是有效数字

其次,在循环外使用虚拟值定义一次参数,然后在循环内将值设置为当前项的状态并执行查询

第三使用参数也用于代码值

j = 0 ' you should initialize this variable to a valid index inside the items collection of the combo'
sqlstr = "UPDATE Student SET Day" & Inquiry & "=@field1 WHERE Code=@code"
DBCmd = New MySql.Data.MySqlClient.MySqlCommand(sqlstr, DBConn)
With DBCmd
    .Parameters.AddWithValue("@field1", 0)
    .Parameters.AddWithValue("@code", Convert.ToInt32(CB_Students.Items(j)))
    For j = 0 To CheckedListBox1.Items.Count - 1
        S = if(CheckedListBox1.GetItemCheckState(j) = CheckState.Checked, 1, 0)
       .Parameters("@field1").Value = S
       .ExecuteNonQuery()
    Next j
End With

这种方法效率不高,因为对每天的项目(检查或不检查)执行更新命令,但要消除这种低效率将需要完全重写此代码。

至于组合框项目的用法,我认为您应该使用 SelectedValue 属性,但这取决于您如何填充组合以及将哪个值分配给 ValueMember 属性以及哪个数据类型是code数据库字段

于 2013-04-05T19:45:44.733 回答
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 回答