开发者

vb.net call the same function twice from button Event Click

This is my code on button event click function

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

This is my class Koneksi code :

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(开发者_JS百科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

Both of the code above, produces

'System.InvalidOperationException' occurred in System.Data.dll error.

When I debug it, the second call of con produces this error. It seems that in VB.NET, the instance class function only can called once at a time, any solution?


Consider refactoring your code. You're actually hitting the database 3 times, each with a LIKE clause, where you really only need to do this once.

Suggest something like this, which performs the same business logic that you've got, with only one call to your database. It's also got some SQL injection prevention.

    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
  • You'll retrieve your barang object properties in one statement. All three properties are gathered from the DB at once. When you inevitably want to add another property to your DataGridView, you won't have to make any extra round-trips to your database, but rather only modify your SQL statement, and the .Rows.Add) call.
  • The database is now safe from SQL injection in this call.
  • the code is easier to read and understand for the next developer coming into read this code.
  • the database was previously using more resources due to being called 3x, and using a LIKE clause, where you really only needed an = name.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜