VB.NET: Menyimpan Setting Koneksi di User Setting


Dimanakah kita menyimpan setting koneksi supaya bisa lebih dinamis dan dapat disetting oleh user?

Aplikasi dengan framework .NET menyediakan fasilitas built in untuk menyimpan setting yang dapat diakses dan diatur saat runtime. Sehingga user dapat mengubah setting tanpa harus melakukan compile ulang aplikasi.

Untuk lebih jelas nya kita langsung saja buka Project Properties dengan cara klik menu Project -> [Nama Project] Properties.

Saat Project Properties terbuka klik tab Setting yang ada disisi kiri. Terdapat 4 kolom isian untuk masing-masing baris setting yaitu Name, Type, Scope, Value. Rani isikan setting-setting yang diperlukan untuk koneksi sebagai berikut:
Name merupakan nama dari setting yang nantinya dapat dipanggil dari code.
Type adalah tipe data untuk nilai yang diisikan.
Scope terdiri dari 2 jenis User dan Application. Scope Application bersifat readonly (hanya bisa dibaca) saat runtime sementara scope user readable dan writeble (bisa dibaca dan diganti). Karena disini kita ingin user dapat mengatur sendiri setting maka dipilihlah Scope User. Setting ini akan tersimpan pada level user account, karena itu jika user window login berbeda bisa memiliki setting berbeda pula.
Sementara value merupakan nilai default dari setting sebelum nanti user dapat mengubahnya.

Oke, lanjut.....
String koneksi adalah variable yang perlu diakses dari hampir seluruh bagian project karena itu mari kita buat variable-variable public yang disimpan dalam sebuah module.
Klik Project -> Add Module...
Pilih template Module, berinama (contoh: ModGlobalVar) kemudian klik Add.

Di dalam nya Rani simpan 4 variable untuk menyimpan nama server, user, password, dan nama database. Serta 1 buah variable string untuk menyimpan connection string lengkap.
Module ModGlobalVar

    Public dbServer As String
   
Public dbUser As String
   
Public dbPassword As String
   
Public dbName As String
   
Public sLocalConn As String

End Module


Kemudian kita buat juga sebuah sub procedure public untung memberikan nilai pada variable-variable tersebut yang diambil dari user setting. Bisa disimpan juga dalam module sehingga bisa dipanggil dimanapun dalam project saat diperlukan.
Public Sub GetDatabaseSetting()
    dbServer = My.Settings.dbServer
    dbUser =
My.Settings.dbUser
    dbPassword =
My.Settings.dbPassword
    dbName =
My.Settings.dbName
    sLocalConn = "server=" & dbServer & ";user id=" & dbUser & ";" & _
                 "password=" & dbPassword & ";database=" & dbName
End Sub


Sub GetDatabaseSetting dipanggil saat applikasi mulai dijalankan (misal nya saat form splash load). Tapi saat ini Rani fokus dulu ke form koneksi nya yah, jadi sub ini akan dipanggil pada load form koneksi.
Oiya kita tambahkan juga di module sebuah function untuk mengecek apakah setting database koneksi dapat terkoneksi sengan baik.
Public Function DatabaseConnected(Optional ByVal Server As String = "", _
           
Optional ByVal User As String = "", _
           
Optional ByVal Password As String = "", _
           
Optional ByVal DatabaseName As String = "") As Boolean
  Dim conn As MySqlConnection
  conn = New MySqlConnection()
  If Server = "" And User = "" And Password = "" And DatabaseName = "" Then
     conn.ConnectionString = sLocalConn
  Else
     conn.ConnectionString = "server=" & Server & ";user id=" & _

                             User & ";password=" & Password & _
                             ";database=" & DatabaseName
  End If
  Try

      conn.Open()
      conn.Close()
      Return True
  Catch myerror As MySqlException
      Return False
      MessageBox.Show("Error: " & myerror.Message)
  Finally
      conn.Dispose()
  End Try
  Return False
End Function


Nah ceritanya untuk mempercepat, kita bisa pakai template form dialog untuk membuat form ini:
Atur UI sebagai berikut:
Code:
Imports System.Windows.Forms

Public Class frmConnection

    Private Sub frmConnection_Load(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles MyBase.Load
        GetDatabaseSetting()
        txtDbServer.Text = dbServer
        txtDbUser.Text = dbUser
        txtDbPassword.Text = dbPassword
        txtDbName.Text = dbName
    End Sub

    Private Sub OK_Button_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles OK_Button.Click
        If DatabaseConnected(txtDbServer.Text, txtDbUser.Text, _
                             txtDbPassword.Text, txtDbName.Text) = True Then
            With My.Settings
                .dbServer = txtDbServer.Text
                .dbUser = txtDbUser.Text
                .dbPassword = txtDbPassword.Text
                .dbName = txtDbName.Text
                .Save()
            End With
            GetDatabaseSetting()
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
            Me.Close()
        End If
    End Sub


    Private Sub Cancel_Button_Click(
ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles
Cancel_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.Close()
    End Sub

End Class

Pada event OK_Button_Click kita bisa melihat bagaimana cara mengubah nilai setting.
Sekian, selamat mencoba


Click here if you like this article.


Post a Comment

42 Comments

Agisda said…
Sangat jelas dan rinci, dari yang pernah saya baca.
Terimakasih b'Rani info-nya.
ijin utk copy yah.
:)
david rumapea said…
Selamat pagi ibu rani, terima kasih sekali atas postingannya sangat membantu..
Btw, saya ingin bertanya apakah cara ini hanya untuk koneksi ke database? jika saya ingin mengatur (misal) size dari form, picturebox yang ada di form ... apakah itu semua bisa diaplikasikan lewat cara ini?
Dan untuk keterangan kolom value setelah kolom scope itu penjelasannya apa yah? kita mengisikan apa di kolom value tersebut?

Sebelumnya saya ucapkan terima kasih

Salam,
rani said…
ga mesti buat koneksi aja, buat menyimpan nilai settingan lain juga bisa dipakai.
value itu diisi nilai default sebelum nanti user bisa mengubah nya sendiri.
david rumapea said…
please give me a correct example for picturebox value enabled bu rani..

AppSetting

Name : PictureBox
Type : System.Windows.Forms.PictureBox
Scope : User
Value : True (bener gak ini default value nya? kalau benar, aplikasi tau darimana value ini untuk properties enabled?)

Setelah di app setting, apa perlu saya membuat module seperti untuk mengkoneksikan database? bisa tolong kasih contoh bu? :(

Terima kasih banyak ibu rani
rani said…
Klo nilai digunakan untuk mengatur property Enabled = True/False, berarti lebih tepat nya pakai Type = Boolean.

Klo rani bikin module itu supaya nilai setting nya bisa dimasukan ke variable yang bersifat public dan dapat diakses/digunakan dari semua form yang ada di project yang bersangkutan.

tapi klo mau langsung ambil dari setting juga bisa koq.
contoh:
PictureBox1.Enabled = My.Settings.PictureBox
david rumapea said…
Terima kasih bu rani atas jawabannya
Saya akan coba ya bu, tapi nanti jika ada masalah yang tak terpecahkan :D
bisa kan saya tanya kembali?

Bisa minta alamat emailnya bu?

Thanx
rani said…
This comment has been removed by the author.
parhana said…
Matur nuwun mba rani, ini dy tutor yg lg sy cari. Salam sukses mba
happit said…
Mb Rani, saya sudah mencoba, pada saat di running saya coba ganti Server Name : localhost menjadi misalnya 192.168.1.1, kemudian klik OK. tapi pada saat di running ulang, value Server Name kembali menjadi localhost lagi atau tidak berubah menjadi 192.168.1.1, mohon pencerahan.... mksh
rani said…
klo saat debug emang biasa nya ga berubah, baru keliatan efek nya klo di compile trus nanti ngubah nya di registry
RN said…
mbak rani mau tanya,...
klo misalnya form koneksi itu, muncul cuman sekali waktu buat koneksi ke-DB
lalu,..setelah ditekan OK muncul form login gmna yaa??

note :....kan jika program pertama kali dijalankan di setiap komputer itu butuh koneksi
rani said…
project bisa di build dengan nilai setting default kosong misalnya, trus saat pertama kali dijalankan di cek apa nilai setting sudah ada nilai/bisa koneksi dengan sukses pakai if clause

klo koneksi sukses save settingan kemudian form login nya dimunculkan pake frmLogin.Show
RN said…
maaf mbak,..
bisa kasih contoh kodingan cek nilai setting sudah ada/tidak
sama yang if clause itu mbakk???

masih pemula saya mbakkk ..hehehe
OS said…
salam knal Rani..
saya kbetulan sdang mcari cara untuk mjalankan aplikasi dr komputer klien, dan bingung untuk mnghubungkannya dengan database yg running dr Server itu bagaimana.
stelah saya coba cara Rani, stelah dtekan OK tdk terjadi apa2, bila saya sngaja mngisi data database nya di form jg tdk terjadi apa2.
mohon pencerahannya,trims..
Anonymous said…
halo? maaf sya bertanya, sya sudah mencoba dan berhasil, akan tapi bgaimana cara dengan adanya setingan di atas kita bisa membuat login dan membaca hasil dari setingan yang ada di form koneksi? karena jika sya tidak buat koneksi tambahan, sya tidak bsa login karena login pass tersimpan di database? yang harusnya jika sudah melalui form tak perlu lagi membuat source codenya.

Imports System.Data.SqlClient
Module ModuleConnection
Public connection As SqlConnection ' declaration our connection
Public DS As DataSet
Public DR As SqlDataReader
Public DA As SqlDataAdapter
Public cmd As SqlCommand
Public DT As DataTable
Public STR, sql As String
Public QUERY As String
' function for connection

'local Connection
Public dbServer As String
Public dbUser As String
Public dbPassword As String
Public dbName As String
Public sLocalConn As String

Public Sub GetDatabaseSetting() 'This make Public so can do anywhere we want
dbServer = My.Settings.DbServer
dbUser = My.Settings.dbUser
dbPassword = My.Settings.dbPassword
dbName = My.Settings.dbName
sLocalConn = "server=" & dbServer & ";user id=" & dbUser & ";" & "password=" & dbPassword & ";database=" & dbName
End Sub
Public Function DatabaseConnected(Optional ByVal Server As String = "", Optional ByVal User As String = "", Optional ByVal Password As String = "", Optional ByVal DatabaseName As String = "") As Boolean
Dim conn As SqlConnection
conn = New SqlConnection
If Server = "" And User = "" And Password = "" And DatabaseName = "" Then
conn.ConnectionString = sLocalConn

Else
conn.ConnectionString = "server=" & Server & ";user id=" & User & ";password=" & Password & ";database=" & DatabaseName
End If

Try
conn.Open()
conn.Close()
Return True
Catch myerror As SqlException
Return False
MessageBox.Show("Error: " & myerror.Message)
Finally
conn.Dispose()
End Try
Return False

End Function
Sub OpenConnection()

Try

connection = New SqlConnection("Data Source=DESKTOP-5VBP3C9\SQLEXPRESS;Initial Catalog=crud_sqlserver;Integrated Security=True") 'Main Xample
If connection.State = ConnectionState.Closed Then
connection.Open() ' open the connection
End If
Catch ex As Exception
MsgBox("Failed to connect, Error at " & ex.ToString)
End Try
End Sub
End Module

sya harus mengisi Try lagi untuk bisa login?
bgaimana jika tanpa source code connecti?
rani said…
maaf, saya agak kesulitan memahami code dan pertanyaan nya ^_^
contoh yang saya pakai database-nya pakai mysql.
klo pakai SQL Server silahkan disesuaikan connection string nya
Agung Triwibowo said…
Kayaknya dimodule Global harus didefinisi dulu ya
Imports MySql.Data.MySqlClient
...:)
rani said…
iyah klo function DatabaseConnected nya disimpan di module global
Imports MySql.Data.MySqlClient
dan itu keperluan untuk koneksi ke database mysql nya
Riandi said…
kak rani dari Software Engineer at PT. IComm International Bandung ya,
ini pertama saya pake app.config, teknik kakak uda jalan

Cuma kendala, biasanya saya pake Mysql dgn xampp dan ini sifatnya statis , gak bisa diubah server,user,login dan database, kalo pake punya data kakak app.config bisa diubah via notepad lebih dinamis ..

yg biasa saya pakai
module:
Module Modulekoneksi
'koneksi
Public CONN As New MySqlConnection 'myqlconn
Public STR As String 'SQL
Public DA As MySqlDataAdapter 'myAdapter
Public DS As DataSet 'myData
Public CMD As MySqlCommand
Public DR As MySqlDataReader

Public CMD1 As MySqlCommand
Public DR1 As MySqlDataReader

Sub KoneksI()
Call KoneksIServer() 'panggil koneksi
Dim DatabaseName As String = "karisma" 'Database Name
Dim server As String = "localhost" 'ip address here
Dim userName As String = "root"
Dim password As String = ""
If Not CONN Is Nothing Then CONN.Close()
' sifatnya statis data tidak bisa diubah nama server hingga database
CONN.ConnectionString = String.Format("server={0}; user id={1}; password={2}; database={3}; pooling=false", server, userName, password, DatabaseName)

Try
CONN.Open()
'MessageBox.Show("Koneksi Berhasil")
CONN.Close()
Catch myerror As MySqlException
MessageBox.Show("Error Koneksi: " & myerror.Message)
Finally
CONN.Dispose()
End Try
End Sub

End Module

login form nya :
Private Sub BtnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click
Call KoneksI() 'panggil koneksi
CONN.Open() 'buka database
CMD = New MySqlCommand("select * from tbluser where kode_user='" & txtuser.Text & "' and pwd_user='" & Txtpass.Text & "'", CONN)
DR = CMD.ExecuteReader
DR.Read()
If Not DR.HasRows Then ' jika tdk ditemukan munculkan pesan
MsgBox("Login gagal")

'kosongkan
txtuser.Clear()
Txtpass.Clear()

Else
'jika ada hilangkan login
Me.Visible = False
MenuUtama.Show() 'munculkan menu utama
end if
end sub

Hanya panggil call koneksi aja buat buka server
Call KoneksI() 'panggil koneksi
CONN.Open() 'field database
CMD = New MySqlCommand("select * from tbluser where kode_user='" & txtuser.Text & "' and pwd_user='" & Txtpass.Text & "'", CONN)

-------------------------------
Kalo saya mau adaptasikan login dimana app.config hanya untuk ambil Server

Form login saya uda coba
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click

dim conn As MySqlConnection

DatabaseConnected() ' connect ke app.config untuk baca server
conn.Open()
CMD = New MySqlCommand("select * from tbluser where kode_user='" & txtuser.Text & "' and pwd_user='" & Txtpass.Text & "'", conn)
DR = CMD.ExecuteReader <--- akan error database not found

bagaimana agar connection bisa baca database
makasi kak rani
rani said…
@riandi: klo saran rani sih bikin 1 public function untuk ambil nilai field. Nantinya ini bisa dipakai berulang-ulang untuk keperluan lainnya selain login.
Simpan aja di 1 module khusus untuk keperluan database.

Public Function GetFieldValue(ByVal FieldName As String, ByVal TableName As String, ByVal WhereClause As String, ByVal DefaultValue As String) As String
Dim conn As MySqlConnection
Dim cmd As New MySqlCommand
Dim objValue As Object

conn = New MySqlConnection()
conn.ConnectionString = sLocalConn
Try
conn.Open()
cmd.Connection = conn
cmd.CommandText = "SELECT " & FieldName & " FROM " & TableName & " " & WhereClause & " LIMIT 1"
objValue = cmd.ExecuteScalar()
conn.Close()
If objValue Is Nothing Then
Return DefaultValue
ElseIf IsDBNull(objValue) Then
Return DefaultValue
Else
Return objValue.ToString
End If
Catch myerror As MySqlException
MessageBox.Show("Error: " & myerror.Message)
Finally
conn.Dispose()
End Try
Return DefaultValue
End Function


Nanti cara pakainya bisa seperti ini:
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click

If GetFieldValue("COUNT(*) AS ceklogin", "tbluser", "where kode_user='" & txtuser.Text & "' and pwd_user='" & Txtpass.Text & "'", 0) > 0 Then
MsgBox("login berhasil")
Else
MsgBox("login gagal")
End If

End Sub

Silahkan disesuaikan aja, sama keperluan login nya....
Riandi said…
kak @rani, makasi kak rani saya coba dulu, agak binggung gabungkan app.config y simpan server, sedangkan di database untuk Select,update, delete.. soalnya kalo koneksi ambil data server,host,pass,dan nama database di database, saya uda coba gagal.. kayaknya teknik kakak yg cocok.. jadi server di pisah di app.config, bisa di ubah vai notepad..

sekali lagi makasi kak, saya coba dulu
Riandi said…
kak rani berarti

Kita buat module baru ya

isinya yg ini:

Public Function GetFieldValue(ByVal FieldName As String, ByVal TableName As String, ByVal WhereClause As String, ByVal DefaultValue As String) As String
Dim conn As MySqlConnection
Dim cmd As New MySqlCommand
Dim objValue As Object

conn = New MySqlConnection()
conn.ConnectionString = sLocalConn
Try
conn.Open()
cmd.Connection = conn


artinya
Function
DatabaseConnected()

tidak diperlukan , ini
conn.ConnectionString = sLocalConn

sudah mewakili untuk baca server, host, pass dan nama database

gak perlu ini lagi
Call KoneksI() 'panggil koneksi
CONN.Open() 'buka database
CMD = New MySqlCommand("select ---****----, CONN)

ok, saya coba dulu, maaf, saya uda cari topik bahas app.config, gak ketemu.. pas pake punya kakak, hanya bisa tuk cek koneksi database
tapi saya mau pake buat yg lain. cek customer, login, penjualan, pembelian yg berhubungan select,update dan delete

tapi server ada di app.config dan database ada di Xampp


makasi kak

rani said…
loh sLocalConn kan ambil dari app.config
dan kenapa mesti edit di notepad (walopun bisa)
artikel ini kan menjelaskan gimana user bisa milih sendiri setingan koneksi dari UI yang kita buat.
Riandi said…
This comment has been removed by the author.
rani said…
iya kita bisa simpan apa aja di property project -> setting dan kita bisa gunakan untuk apa saja termasuk host,user dan password xampp
tinggal nama dan type data nya aja disesuaikan. di artikel ini sebenarnya udah ada jawaban nya, tapi sepertinya kurang dipahami.

Coba lihat bagian ini:

Public Sub GetDatabaseSetting()
dbServer = My.Settings.dbServer
dbUser = My.Settings.dbUser
dbPassword = My.Settings.dbPassword
dbName = My.Settings.dbName
sLocalConn = "server=" & dbServer & ";user id=" & dbUser & ";" & _
"password=" & dbPassword & ";database=" & dbName
End Sub

GetDatabaseSetting dipanggil saat aplikasi berjalan. Simpan aja di sub main atau di event form_load pertama saat aplikasi berjalan.

sLocalConn ini kita deklarasikan sebagai variable public, yang akan mengambil data dari setting. Nah si setting ini secara fisik akan menjadi file app.config

Saat kita mengubah nilai setting si GetDatabaseSetting dipanggil lagi supaya setting koneksi.

Klo kmu ngikutin artikel ini, coba lihat di bin nanti otomatis akan membuat file app.config sendiri.
Riandi said…
makasi kak rani, maaf banyak nanya. soalnya masih proses belajar, bukan orang IT..makasi skali lagi
yohimato reload said…
mbak Rani, setelah muter2 ke mana2 akhirnya balik lagi nyimak blog ini, diatas setting valuenya adalah dblatian, jika form koneksi ini digunakan pada nama db lain, apa harus compil ulang ? maaf mungkin sdh ada yg menanyakan, mau baca komen panjangg, sepertini rame banget blog ini, trims
rani said…
saat aplikasi nya udah diinstall di PC user. Kita bisa ngubah nama database dengan nama lain dan Save ke setting yang akan mengubah file yang ekstensi nya .config.
Jadi ga usah di build ulang.
Riandi said…
alhamdullilah lebih gampang pake xml
gak seribet pake config, saya malah liat xml lebih simple pake ReadWriteXML ...bisa save dan edit lebih mudah,tapi makasi kak rani, uda nyoba, tapi saya malah cendrung pake xml...
yohimato reload said…
ok siip mbak rani, tapi setelah sy coba debug muncul notif Visual Studio cannot start debugging because the debug target ... is missing...", sy coba gogling belum nemu solusi yg tepat, bisa dijelaskan knp hal itu terjadi ?,trims
rani said…
@riandi: it's okay.. coding mah gimana nyamanya si coder. Banyak cara menuju roma.

@hijram: itu kayak nya folder buat debug nya terhapus atau readonly.
yohimato reload said…
mbak rani gmn menambahkan statusstrip bertuliskan status connect dan status disconnect untuk menandakan status koneksinya ,trims
yohimato reload said…
klo mau ditambahkan tcp port , kodingnya jadi seperti apa mbk, karena ada kebutuhan tertentu terkadang database di pasang bukan di port 3306 , bisa jadi 3307 atau port yg lain,trim
rani said…
@hijram:
status connect/disconnect tergantung pakai control apa buat nampilinnya. Coba baca lagi artikel nya ada bagian function DatabaseConnected yang mengembalikan nilai boolean True/False.
Jadi tinggal dipasangin IF Clause aja True -> Connected, False -> disconnected.

untuk port bisa ditambahin di connection string nya, e.g.
Dim connStr As String = "server=localhost;user=root;database=world;port=3306;password=******;"
Diastizar said…
Mba rani aku mau tanya, form dialog tersebut dijalankan pada saat kapan?
rani said…
saat diperlukan hehe...
klo aku manual manggil dari menu setting.
Dan saat aplikasi pertama kali dijalanin, dia kan cek koneksi. Klo koneksi nya gagal form dialog nya muncul.
Andre said…
Mba Rani,
Bisa bikin koneksi database access runtime gak mba melalui openfiledialog. Jadi ketika user buka aplikasi, user harus milih database access melalui openfiledialog mba.
Makasih
rani said…
Access umum nya disimpan di application path. Klo mau dibuat dinamis ya bisa pake open dialog trus nanti path nya disimpan di setting.
Andre said…
@rani irsan
Ada waktu buat bikin tutorialnya gak mba?
Kalo ada boleh tuh mba..
Makasih
Unknown said…
Assalamu'alaikum,
bu Rani saya gagal menginisialisasi di User setting itu kenapa ya, saya sudah ikuti tutorial ini, tapi gagal.

Terim kasih sebelumnya.
rani said…
gagalnya gimana? settingan ga ke save/load atau koneksi nya gagal?