VB.NET:从(CheckedListBox-ComboBox)更新MySQL数据库

时间:2013-04-05 19:05:11

标签: mysql vb.net for-loop combobox checkedlistbox

我已经制作了一份表格,可以获得特定会话的出勤详情。 使用的元素是:

1- CheckedListBox

2-组合框:CB_学生

3-按钮:更新

我的表是Student,其中包含Code |名字|姓氏|第一天|第2天|第三天|第四天| Day5,其中Days是tinyint类型,指的是Presence或Absence。

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

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

例如,我的学生表如下:

代码| F_Name | L_Name

1 | F1 | L1

2 | F2 | L2

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

在表单加载期间也会找到日期编号,并将其保存为公共变量查询。

以下是我更新按钮的代码:

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服务器版本对应的手册正确的语法在''4'附近使用= 1 WHERE Code ='6''在第1行“。

价值似乎是正确的。日期编号为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的方式应该有问题。我怎样才能让它发挥作用?

我真的很感激帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先从字符串查询中删除单引号,以将字段的渐进性连接到单词日。的提防即可。我想您可以完全控制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数据库字段

答案 2 :(得分: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

这个很难!但是,哎呀,它解决后很容易,嗯?