2011-05-28 61 views
0

這是我的按鈕事件單擊功能代碼vb.net從按鈕事件調用同一個函數兩次點擊

Dim con As New Koneksi 
DataGridView1.Rows.Add(con.getIdTambahBarang(cbBarang.Text), _ 
         con.getNamaTambahBarang(cbBarang.Text), _ 
         con.getHargaTambahBarang(cbBarang.Text), _ 
         txtJumlah.Text) 

這是我的課Koneksi代碼:

Public Function getIdNamaHargaTambahBarang(ByVal namaBarang As String, ByVal params As String) As String 
    Dim id As String = "" 
    Dim nama As String = "" 
    Dim harga As String = "" 
    Try 
     bukaKoneksi() 
     cmd.Connection = con 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = "SELECT * FROM barang WHERE nama_barang like '" & namaBarang & "'" 
     reader = cmd.ExecuteReader 
     If (reader.Read()) Then 
      If params = "getNama" Then 
       nama = reader.GetString(1) 
       Return nama 
      End If 
      If params = "getHarga" Then 
       harga = reader.GetDouble(2).ToString 
       Return harga 
      End If 
      If params = "getId" Then 
       id = reader.GetString(0) 
       Return id 
      End If 
     End If 
     tutupKoneksi() 
    Catch ex As Exception 
    End Try 
End Function 

Public Function getIdTambahBarang(ByVal namaBarang As String) As String 
    Return getIdNamaHargaTambahBarang(namaBarang, "getId") 
End Function 

Public Function getNamaTambahBarang(ByVal namaBarang As String) As String 
    Return getIdNamaHargaTambahBarang(namaBarang, "getNama") 
End Function 

Public Function getHargaTambahBarang(ByVal namaBarang As String) As String 
    Return getIdNamaHargaTambahBarang(namaBarang, "getHarga") 
End Function 

兩個密碼的上方,生產

'System.InvalidOperationException'發生System.Data.dll錯誤。

當我調試它時,第二次調用con會產生這個錯誤。看來在VB.NET中,實例類函數一次只能調用一次,任何解決方案?

+0

通常會有一條消息附加到一個異常,這個消息通常會被用來表明什麼使得操作無效。我從代碼中猜測,英語不是您的主要語言 - 您能否添加原始信息(以及來自哪種語言),並且如果可能,您嘗試翻譯它? – 2011-05-28 13:55:00

+0

另外'Catch Ex作爲例外','結束嘗試'不是很好的錯誤處理 - 當你不調試這段代碼時,任何錯誤都會隱藏起來,不會給出任何錯誤的線索。 – 2011-05-28 14:03:14

回答

1

考慮重構你的代碼。你實際上碰到了3次數據庫,每個都有LIKE條款,你只需要這樣做一次。

建議像這樣的東西,它執行相同的業務邏輯,只有一次調用數據庫。它也有一些SQL注入預防。

Dim con As New Koneksi 
    Dim barang As Barang = Koneksi.GetBarang() 
    DataGridView1.Rows.Add(barang.id, 
          barang.nama, _ 
          barang.harga, _ 
          txtJumlah.Text) 

Public Class Koneksi 
    Public Function GetBarang(nama_barang As String) 
     Dim barang As New Barang 
     bukaKoneksi() 
     cmd.Connection = con 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = "SELECT id,name,harga FROM barang WHERE nama_barang = @nama" 
     cmd.Parameters.AddWithValue("@nama", namaBarang) 
     reader = cmd.ExecuteReader 
     If (reader.Read()) Then 
      barang.id = reader.reader.GetString(0) 
      barang.nama = reader.GetString(1) 
      barang.harga = reader.GetDouble(2).ToString 
     End If 
     tutupKoneksi() 
     Return barang    
    End Function 
End Class 
  • 你會在一條語句檢索您barang對象屬性。所有這三個屬性都是從DB中收集的。當你不可避免地想要添加另一個屬性到你的DataGridView中時,你不需要額外往返數據庫,而只需修改你的SQL語句和.Rows.Add)調用。
  • 數據庫現在可以在此調用中免於SQL注入。
  • 代碼更易於閱讀和理解下一位開發人員閱讀此代碼。
  • 由於被稱爲3x,並且使用LIKE子句,因此數據庫以前使用的資源更多,您只需要= name
相關問題