2013-04-05 84 views
0

我製作了一個表格,該表格應該可以獲取特定會話的出席詳情。 所使用的元素是:VB.NET:更新來自(CheckedListBox-ComboBox)的MySQL數據庫

1- CheckedListBox

2-組合框:CB_Students

3-按鈕:更新

我的表是學生,其中包含編碼|名字|姓氏|第一天|第2天|第三天|第四天|第5天,其中Days是tinyint類型,指的是Presence或Absence。

我希望用戶從CheckedListBox中檢查學生的姓名,所以我填入CheckedListBox,並在名字和姓氏上拼接,每個項目顯示全名。由於CheckedListBox是間接由數據庫記錄創建,我想我不能直接連接到數據庫,所以我創建了一個隱藏的ComboBox與CheckedListBox中顯示的每個學生對應的代碼值。

例如,我的學生表如下:

代碼| F_Name | L_Name

1 | F1 | L1

2 | F2 | L2

的CheckedListBox包含:F1 L1和F2 L2,和組合框包含1和2

日的數字也被窗體加載過程中發現,並保存爲公共變量查詢。

下面是我的更新按鈕代碼:

Dim j, S As Integer 
    sqlstr = "UPDATE Student SET Day'" & Inquiry & "'[email protected] 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() 

但是,在執行過程中,我得到的錯誤:「參數‘@字段1’已經被定義。」

我應該如何處理這個問題? 此外,聲明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,代碼爲6.我沒有看到問題所在。

更新2:

下面是用於填充CheckedListBox和組合框,這是在形式負載的代碼。 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:

我已經改變了查詢的數據類型爲String,並刪除單引號。

無論如何,我在想也許我可以做出不同的字段編號。類似這樣的:

Dim j, S, k As Integer 
    sqlstr = "UPDATE Student SET D" & Inquiry & " [email protected]" & 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時,應該會出現錯誤。我怎樣才能使它工作?

我真的很感謝幫助!

+0

Holy Sql注射警戒,蝙蝠俠!你的代碼實際上是乞求被黑客攻擊。更糟糕的是,當你知道使用參數的時候。 – 2013-04-05 20:39:41

+0

@JoelCoehoorn,你是什麼意思? – 2013-04-05 21:34:59

回答

0

只是想出了答案。由於我們無法重新創建@field1,因此我們通過將它放入一個循環來重新創建sql字符串(整個事物)。

For j = 0 To CheckedListBox1.Items.Count - 1 
     S = CheckedListBox1.GetItemCheckState(j) 
     sqlstr = "UPDATE Student SET D" & Inquiry & " [email protected] 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 

這一個是相當強硬!但是,當它解決時它變得容易,呃?

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 
+0

它不起作用。 我收到以下錯誤:「您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在''4'= 1附近使用正確的語法'WHERE Code ='6''at line 1 「 其中4是查詢,1是field1的值,6是代碼。 – 2013-04-05 19:23:47

+0

嘿,謝謝!你的回答非常有幫助! – 2013-04-05 22:51:34

+0

如果您接受或投票,請標記爲答覆 – Kasnady 2013-04-06 02:22:22

0

首先從字符串查詢刪除單引號逐步領域串聯到單詞的一天。 請注意。我想,你有充分的控制權,查詢變量的值,並檢查它是否是串聯的日字

與虛值,定義你的參數只有一次外循環,然後纔有效數字,循環內的值設置爲當前項目的狀態和執行查詢

使用參數也爲代碼值

j = 0 ' you should initialize this variable to a valid index inside the items collection of the combo' 
sqlstr = "UPDATE Student SET Day" & Inquiry & "[email protected] WHERE [email protected]" 
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數據庫字段

+0

Steve,Inquiry是一個整數,所以我認爲我應該保留單引號,對不對? 此外,組合框被隱藏,因此不能選擇任何值。 我也嘗試了不同的格式,我在問題中更新了。如果你能看一看就太好了! – 2013-04-05 20:21:48

+0

不,如果你留下單引號,你的查詢將是錯誤的:'更新學生設置日'1'= 1 ....'和你的字段名稱是'日1' – Steve 2013-04-05 20:29:56

+0

至於組合框,如何添加項目到組合框?你是否將ValueMember屬性設置爲正確的字段名稱?哪個數據類型是字段'code'? – Steve 2013-04-05 20:31:19