Teman-teman, wah saya lagi menghadapi masalah nih tolong dong.
Saya punya combobox dan combobox itu telah berisi data (Category) dari database. Apa yang saya mau adalah saat saya memilih salah satu category, semua data dari database dalam category yang sama ditampilkan di listbox. Saya telah menggunakan sql command,
"SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"
tapi tidak bisa. Selalu saja ada exception. Apa ada yang bisa membantu? Saya sangat bersyukur kalau ada yang bisa memberikan cara yang lain. Tolong ya karena ini untuk membuat kamus Pali-English.
NB: Saya Pakai VB.Net
Thanks
software yg digunakan apa? errornya apa?
heran, kamus pali-english kok ada data customer?
combobox1.selectedindex mungkin bernilai numerik yaitu index dari combobox1, sementara nilai yg diharapkan oleh SQL adalah string. mungkin bisa coba property lainnya, misalnya combobox1.text
selectedindex tuh buat tau indexnya..
tapi kalo emang sengaja... seharusnya gak error...
coba kasih kode lengkap di event itu..
udah coba selectedtext ?
Quote from: dhammasiri on 07 January 2010, 12:18:00 PM
Teman-teman, wah saya lagi menghadapi masalah nih tolong dong.
Saya punya combobox dan combobox itu telah berisi data (Category) dari database. Apa yang saya mau adalah saat saya memilih salah satu category, semua data dari database dalam category yang sama ditampilkan di listbox. Saya telah menggunakan sql command,
"SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"
tapi tidak bisa. Selalu saja ada exception. Apa ada yang bisa membantu? Saya sangat bersyukur kalau ada yang bisa memberikan cara yang lain. Tolong ya karena ini untuk membuat kamus Pali-English.
NB: Saya Pakai VB.Net
Thanks
setahu gw tetap pake combobox1.value deh..
jadi "select * from <table> where <field> = '"+<combobox1.value>+"'"
tapi jujur saja, saya TIDAK SUKA cara di ATAS.. sintax sql kayak di atas SANGAT BERBAHAYA..
misal kalau ada yang isi combobox dengan yang mengandung ' maka akan kacau
jadi saya sarankan pakailah methode preparation
seperti "select * from <table> where <field> = [at] nilai"
nantinya [at] nilai itu yang diinput parameternya.
dulu pernah main VB.NET kalau tidak salah ada addparameter deh di recordset. coba bertanyalah pada F1
gw dari based foxpro seh biasa langsung tembak dengan SQLSTRINGCONNECT, dan SQLEXEC
baru tau disini ada thread tuk membahas VB.NET
pake CStr(ComboBox1.SelectedValue) ato CStr(ComboBox1.SelectedText) tergantung bagaimana cara kita menset data untuk ComboBox nya
ComboBox bisa kita binding dengan database, ada 2 property yg bisa di pake
ComboBox1.DisplayMember
ComboBox1.valueMember
CStr() digunakan tuk merubah data dari combobox menjadi string. Klo pake SelectedIndex, yg diambil adalah nilai index dari DisplayMember jadi ""SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"" yang terbaca adalah nilai index nya, bukan nilai dari CustomerID nya
semoga membantu
Quote from: Indra on 07 January 2010, 12:20:19 PM
software yg digunakan apa? errornya apa?
heran, kamus pali-english kok ada data customer?
combobox1.selectedindex mungkin bernilai numerik yaitu index dari combobox1, sementara nilai yg diharapkan oleh SQL adalah string. mungkin bisa coba property lainnya, misalnya combobox1.text
Ini kan cuma contoh. Jadi, ya saya copy and paste dari contoh aslinya. Kalau punya saya yang asli sih
Select * From Entry Where EntryId = '" & ComboBox1.SelectedIndex & "'
Berikut ini adalah bagaimana saya menampilkan data dari database ke combobox1:
Private Sub DictLoad()
Dim oDR As SQLite.SQLiteDataAdapter
Dim strSQL As String
Dim strConn As String
Dim oItem As NewDict
Dim intLoop As Integer
Dim oTable As DataTable = New DataTable()
strConn = ConnectStringBuild()
strSQL = "SELECT DictId, DictLists "
strSQL &= "FROM Dictionary"
Try
oDR = _
New SQLite.SQLiteDataAdapter(strSQL, strConn)
oDR.Fill(oTable)
For intLoop = 0 To oTable.Rows.Count - 1
oItem = New NewDict()
With oTable.Rows(intLoop)
oItem.Value = _
.Item("DictLists").ToString()
oItem.ID = CInt(.Item("DictId"))
End With
ComboBox1.Items.Add(oItem)
Next
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
pake combobox1.text
Private Sub get_combo()
Dim DaCombo As MySqlDataAdapter
Dim DsCombo As New DataSet
Dim DtCombo As New DataTable
Try
DtCombo.Clear()
Conn = New MySqlConnection(ConnDBStr.Initial)
Cmd = New MySqlCommand("select * from tbl_golongan", Conn)
DaCombo = New MySqlDataAdapter(Cmd)
DaCombo.Fill(DsCombo, "MasterData")
DtCombo = DsCombo.Tables("MasterData")
ComboBox1.DataSource = DtCombo
ComboBox1.DisplayMember = "deskripsi"
ComboBox1.ValueMember = "kode"
Conn.Close()
Catch ex As Exception
MsgBox("Data golongan gagal ditampilkan !" & vbCrLf & ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
saya biasa binding data dari db ke combo dengan cara gtu, keuntungan nya lebih praktis n simple, trus kita jg bisa atur 2 data ato lebih
data yang mau ditampilkan di set di displaymember, untuk data kode di set di valuemember
contoh diatas saya pake database mysql, klo pake oracle n sqlserver tinggal di sesuaikan aja...
keknya mo pake object buat isi list combonya... (class NewDict)
object oItem itu overide stringnya apa? kalo gak yg muncul malah nama object
Jujur saya mengikuti cara yang diberikan dalam tutorial di MSDN.
Ini adalah class yang saya pergunakan:
Public Class NewDict
Private mstrValue As String
Private mintID As Integer
Public Sub New()
End Sub
Public Sub New(ByVal strValue As String, _
ByVal intID As Integer)
mstrValue = strValue
mintID = intID
End Sub
Property Value() As String
Get
Return mstrValue
End Get
Set(ByVal Value As String)
mstrValue = Value
End Set
End Property
Property ID() As Integer
Get
Return mintID
End Get
Set(ByVal Value As Integer)
mintID = Value
End Set
End Property
Public Overrides Function ToString() As String
Return mstrValue
End Function
End Class
Berikut ini adalah cara saya menampilkan data dari database ke combobox:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DictLoad()
End Sub
Private Sub DictLoad()
Dim oDR As SQLite.SQLiteDataAdapter
Dim strSQL As String
Dim strConn As String
Dim oItem As NewDict
Dim intLoop As Integer
Dim oTable As DataTable = New DataTable()
strConn = ConnectStringBuild()
strSQL = "SELECT DictId, DictLists "
strSQL &= "FROM Dictionary"
Try
oDR = _
New SQLite.SQLiteDataAdapter(strSQL, strConn)
oDR.Fill(oTable)
For intLoop = 0 To oTable.Rows.Count - 1
oItem = New NewDict()
With oTable.Rows(intLoop)
oItem.Value = _
.Item("DictLists").ToString()
oItem.ID = CInt(.Item("DictId"))
End With
ComboBox1.Items.Add(oItem)
Next
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
Masalah saya di bawah ini:
Ada empat kamus yang ditampilkan dalam combobox1. Pali-English, Concise Pali-english, english-Pali, Pali Proper Names. Jelas ini adalah untuk sementara ini. Ada kemungkinan akan ditambah di masa yang akan datang. Apa yang saya mau adalah saat kita klik salah satu Dictionary dalam combobox1, saya ingin semua entry dari kamus yang sama ditampilkan di listbox1. Nah saya tidak tahu caranya, tolong dong karena semua sudah hampir selesai. Database juga sudah siap, saya hanya butuh beberapa tahap lagi untuk menyiapkan database. Selama ini saya sudah mencari berbagai cara tapi ya, karena saya ini programmer bloon, tidak dapat menyelesaikan masalah ini. Mungkin ada cara lain, saya persilahkan untuk memberikan saran.
Berikut ini adalah bagaimana saya menghandle ComboBox1_SelectedIndexChanged:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
ListLoad()
End Sub
Private Sub ListLoad()
Dim oDR As SQLite.SQLiteDataReader
Dim strSQL As String
Dim strConn As String
Dim oItem As NewDict
Dim SqlCom As SQLite.SQLiteCommand
strConn = ConnectStringBuild()
strSQL = "SELECT EntryId, EntryLists "
strSQL &= "FROM Entry"
Me.ListBox1.Items.Clear()
Try
SqlCom = New SQLite.SQLiteCommand()
With SqlCom
.Connection = _
New SQLite.SQLiteConnection(strConn)
.Connection.Open()
.CommandText = strSQL
oDR = _
.ExecuteReader()
End With
ListBox1.Items.Clear()
Do While oDR.Read()
oItem = New NewDict()
With oDR
oItem.ID = CInt(.Item("EntryId"))
oItem.Value = _
.Item("EntryLists").ToString()
End With
ListBox1.Items.Add(oItem)
Loop
If ListBox1.Items.Count > 0 Then
ListBox1.SetSelected(0, True)
End If
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
Quote from: dhammasiri on 08 January 2010, 02:10:20 PM
Public Class NewDict
Implements IDisposable, ICloneable
Private mstrValue As String
Private mintID As Integer
Public Sub New()
End Sub
Public Sub New(ByVal strValue As String, _
ByVal intID As Integer)
mstrValue = strValue
mintID = intID
End Sub
Property Value() As String
Get
Return mstrValue
End Get
Set(ByVal Value As String)
mstrValue = Value
End Set
End Property
Property ID() As Integer
Get
Return mintID
End Get
Set(ByVal Value As Integer)
mintID = Value
End Set
End Property
Public Overrides Function ToString() As String
Return mstrValue
End Function
#Region "ICloneable Support"
Public Function Clone() As Object Implements System.ICloneable.Clone
Return Me.MemberwiseClone()
End Function
#End Region
#Region " IDisposable Support "
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free other state (managed objects).
value = ""
End If
' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
#Region "Destructor"
Protected Overrides Sub Finalize()
Me.Dispose(True)
MyBase.Finalize()
End Sub
#End Region
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DictLoad()
End Sub
Private Sub DictLoad()
Dim oDR As SQLite.SQLiteDataAdapter
Dim strSQL As String
Dim strConn As String
Dim oItem As NewDict
Dim intLoop As Integer
Dim oTable As DataTable = New DataTable()
strConn = ConnectStringBuild()
strSQL = "SELECT DictId, DictLists "
strSQL &= "FROM Dictionary"
Try
oDR = _
New SQLite.SQLiteDataAdapter(strSQL, strConn)
oDR.Fill(oTable)
oItem = New NewDict()
For intLoop = 0 To oTable.Rows.Count - 1
With oTable.Rows(intLoop)
oItem.Value = _
.Item("DictLists").ToString()
oItem.ID = CInt(.Item("DictId"))
End With
ComboBox1.Items.Add(oItem)
Next
oItem.dispose()
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
ListLoad(directcast(combobox1.selecteditem,NewDict).clone)
End Sub
Private Sub ListLoad(selectedDictItem as NewDict)
Dim oDR As SQLite.SQLiteDataReader
Dim strSQL As String
Dim strConn As String
Dim oItem As NewDict
Dim SqlCom As SQLite.SQLiteCommand
strConn = ConnectStringBuild()
strSQL = "SELECT EntryId, EntryLists "
strSQL &= "FROM Entry WHERE DictID = " & selectedDictItem.ID
Me.ListBox1.Items.Clear()
Try
SqlCom = New SQLite.SQLiteCommand()
With SqlCom
.Connection = _
New SQLite.SQLiteConnection(strConn)
.Connection.Open()
.CommandText = strSQL
oDR = _
.ExecuteReader()
End With
ListBox1.Items.Clear()
oItem = New NewDict()
Do While oDR.Read()
With oDR
oItem.ID = CInt(.Item("EntryId"))
oItem.Value = _
.Item("EntryLists").ToString()
End With
ListBox1.Items.Add(oItem)
Loop
oItem.dispose
If ListBox1.Items.Count > 0 Then
ListBox1.SetSelected(0, True)
End If
Catch oExcept As Exception
MessageBox.Show(oExcept.Message)
End Try
End Sub
#Region " IDisposable Support "
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not [b]Me.disposedValue[/b] Then
If disposing Then
' TODO: free other state (managed objects).
value = ""
End If
' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
[b]Me.disposedValue[/b] = True
End Sub
Me.disposedValue kok dibilang bukan member NewDict. Apa yang harus saya lakukan? Sorry kalau harus merepoti.
uppss sorry, maklum cuman copas doank dari source code :P
disposed value, dideklarasikan aja sebagai boolean default false ;D
Private disposedValue As Boolean = False ' To detect redundant calls
itu bawaan interface disposable