none
這段CODE錯了什麼?? RRS feed

  • 問題

  • 當點選 DELETE 就錯誤.......

     

      Dim CID As String = ""
    
    
    
      For Each sItem As ListViewItem In lvList.SelectedItems
    
       CID = sItem.Text
    
      Next
    
    
    
      If CID <> "" Then
    
       'Delete the selected record
    
       Dim strDeleted As Boolean
    
    
    
       strDeleted = ExecNonQuery("DELETE * FROM user WHERE ID= '" + CID + "'")
    
    
    
       If strDeleted = "True" Then
    
        MsgBox("Record's deleted.", MsgBoxStyle.Information)
    
    
    
        Call FillList()
    
       Else
    
        MsgBox(strDeleted)
    
       End If
    
      Else
    
       MsgBox("Please select record to delete.", MsgBoxStyle.Critical)
    
      End If
    • 已編輯 Mr.Frankie 2010年10月13日 下午 03:45
    2010年10月13日 下午 03:13

解答

  • 這個Function 有幾個問題

    (1) 宣告時並未指定回傳型別, 或許是因為想要同時回傳 Boolean 和 ex

    (2) 但因為上述的問題就會發生當你在此Function 中發生問題的時候, 它會將 ex (這是繼承至Exception 類別) 轉成Object回傳, 而你的主程式中是

    strDeleted = ExecNonQuery("DELETE * FROM user WHERE ID= '" + CID + "'")
    而strDeleted的型別是Boolean, 這樣一旦回傳的值是Exception, 鐵定不能轉成Boolean類別, 這也就是那個錯誤訊息的內容

    (3) 你的問題實際發生的位置點是在 ExecNonQuery 這個Function中,

    先把

       Catch ex As Exception
          Return ex
    改成

       Catch ex As Exception
          Messagebox.Show(ex.ToString())

    找出真正的錯誤在哪裡

    (4) 不過我猜測問題發生在 End With 的位置錯了, 因為到了這一步Connection就被Disposed, 所以當cmd.ExecuteNonQuery()根本沒有Connection可用.

    所以應該要改成

    With cnHotel
            If .State = ConnectionState.Open Then .Close()

            .ConnectionString = cnString
            .Open()
        
          Dim cmd As MySqlCommand = New MySqlCommand(strSQL, cnHotel)

          cmd.ExecuteNonQuery()
     End With

    (5) 老話一句, 把基礎的東西看懂. 否則你寫程式出現瓶頸的機率會非常頻繁. 有空看一下小朱的 [如何學習寫程式系列 ], 不要靠著複製與貼上走一堆冤枉路.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Mr.Frankie 2010年10月14日 上午 05:17
    2010年10月14日 上午 04:26
    版主
  • Hi,

    你的ID欄位是字串型態嗎?

    另外你的程式部份

    看起來是With那一區都不需要撰寫

    最多只要帶入ConnectionString

    因為你是每次都New一個新連線

    應該是不用判斷是否已經開啟...

     

     'Execute Non Query
     Public Function ExecNonQuery(ByVal strSQL As String)
     Dim cnHotel As MySqlConnection
     cnHotel = New MySqlConnection
    
     Try
      With cnHotel
      If .State = ConnectionState.Open Then .Close()
    
      .ConnectionString = cnString
      .Open()
      End With

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Mr.Frankie 2010年10月14日 上午 05:17
    2010年10月14日 上午 04:56

所有回覆

  • 錯誤訊息跟除錯模式下的錯誤行標出來。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年10月13日 下午 03:18
  • 1. 承心冷大所講, 你如果有標明錯誤行會有助於別人解答你的問題.

    2. 有幾個問題我想提醒你

     (1)不論是SqlCommand還是OleDbCommand的 ExecuteNonQuery方法回傳的都是Integer, 而不是Boolean. 即使VB.NET對強型別的要求比較寬鬆, 還是不應該這樣做. 你應該正確地使用該方法所設定的回傳型別.

    (2) "DELETE * FROM user WHERE ID= '" + CID + "'" <--這樣組SQL Statement String的方式非常地不好 , 會有很多問題產生 (ex: SQL Injection),除非你武功高強可以自己寫出那些防止SQL Injection的額外程式碼, 否則你應該從現在就養成使用 "參數化查詢" 的好習慣.

    (3) 關於ADO.NET, 你應該放下現在練習的程式碼好好讀一讀 MSDN文件庫中的 [.NET Framework 開發人員手冊 ADO.NET ] 並對其內容加以理解, 其中關於參數化查詢的部份在 [命令和參數 (ADO.NET) ]. 花點時間把這弄懂, 不必急著在電腦上抄別人的Code, 你的進步會更快.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月13日 下午 03:31
    版主
  • 直接進去你的ExecNonQuery方法裡面偵錯,這個方法看起來似乎回傳了一個Exception
    2010年10月13日 下午 04:05
  • For Each sItem As ListViewItem In lvList.SelectedItems

       CID = sItem.Text

      Next

    經過迴圈處理之後, 好像只會刪除最後一筆被選中的記錄, 而不是刪除被選中的所有記錄

    2010年10月14日 上午 01:38
  • 先確認你程式碼中的 ExecuteNonQuery 的回傳值倒底是什麼型態.

    如果這個ExecuteNonQuery方法是自訂的, 請把此方法的內容貼上來


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月14日 上午 03:25
    版主
  • 先確認你程式碼中的 ExecuteNonQuery 的回傳值倒底是什麼型態.

    如果這個ExecuteNonQuery方法是自訂的, 請把此方法的內容貼上來


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    我使用這個 :

      'Execute Non Query
      Public Function ExecNonQuery(ByVal strSQL As String)
        Dim cnHotel As MySqlConnection
        cnHotel = New MySqlConnection
    
        Try
          With cnHotel
            If .State = ConnectionState.Open Then .Close()
    
            .ConnectionString = cnString
            .Open()
          End With
    
          Dim cmd As MySqlCommand = New MySqlCommand(strSQL, cnHotel)
    
          cmd.ExecuteNonQuery()
    
          Return True
        Catch ex As Exception
          Return ex
        Finally
          cnHotel.Close()
        End Try
      End Function
    2010年10月14日 上午 04:08
  • 改成

    strDeleted = ExecNonQuery("DELETE FROM [user] WHERE ID= '" + CID + "'")

    SqlInjection跟ExecNonQuery方法內的ErrorHandle你要再另外處理

    2010年10月14日 上午 04:13
  • 這個Function 有幾個問題

    (1) 宣告時並未指定回傳型別, 或許是因為想要同時回傳 Boolean 和 ex

    (2) 但因為上述的問題就會發生當你在此Function 中發生問題的時候, 它會將 ex (這是繼承至Exception 類別) 轉成Object回傳, 而你的主程式中是

    strDeleted = ExecNonQuery("DELETE * FROM user WHERE ID= '" + CID + "'")
    而strDeleted的型別是Boolean, 這樣一旦回傳的值是Exception, 鐵定不能轉成Boolean類別, 這也就是那個錯誤訊息的內容

    (3) 你的問題實際發生的位置點是在 ExecNonQuery 這個Function中,

    先把

       Catch ex As Exception
          Return ex
    改成

       Catch ex As Exception
          Messagebox.Show(ex.ToString())

    找出真正的錯誤在哪裡

    (4) 不過我猜測問題發生在 End With 的位置錯了, 因為到了這一步Connection就被Disposed, 所以當cmd.ExecuteNonQuery()根本沒有Connection可用.

    所以應該要改成

    With cnHotel
            If .State = ConnectionState.Open Then .Close()

            .ConnectionString = cnString
            .Open()
        
          Dim cmd As MySqlCommand = New MySqlCommand(strSQL, cnHotel)

          cmd.ExecuteNonQuery()
     End With

    (5) 老話一句, 把基礎的東西看懂. 否則你寫程式出現瓶頸的機率會非常頻繁. 有空看一下小朱的 [如何學習寫程式系列 ], 不要靠著複製與貼上走一堆冤枉路.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Mr.Frankie 2010年10月14日 上午 05:17
    2010年10月14日 上午 04:26
    版主
  • Hi,

    你的ID欄位是字串型態嗎?

    另外你的程式部份

    看起來是With那一區都不需要撰寫

    最多只要帶入ConnectionString

    因為你是每次都New一個新連線

    應該是不用判斷是否已經開啟...

     

     'Execute Non Query
     Public Function ExecNonQuery(ByVal strSQL As String)
     Dim cnHotel As MySqlConnection
     cnHotel = New MySqlConnection
    
     Try
      With cnHotel
      If .State = ConnectionState.Open Then .Close()
    
      .ConnectionString = cnString
      .Open()
      End With

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Mr.Frankie 2010年10月14日 上午 05:17
    2010年10月14日 上午 04:56
  • 已解決了^^...謝謝各位老師解答喔

    2010年10月14日 上午 05:17
  • Hi,

    可否告知最後找到的問題是...?


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年10月14日 下午 01:25
  • (4) 不過我猜測問題發生在 End With 的位置錯了, 因為到了這一步Connection就被Disposed, 所以當cmd.ExecuteNonQuery()根本沒有Connection可用.

    所以應該要改成

    With cnHotel
            If .State = ConnectionState.Open Then .Close()

            .ConnectionString = cnString
            .Open()
        
          Dim cmd As MySqlCommand = New MySqlCommand(strSQL, cnHotel)

          cmd.ExecuteNonQuery()
     End With

     

     


    I am so Sorry, 我把 With ...End With 和Using弄混了, 這一段的說法是錯的.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月14日 下午 01:37
    版主