16 May 2015

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.


16 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 irsan 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 irsan 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 irsan said...
This comment has been removed by the author.
Fikko Finna 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 irsan said...

klo saat debug emang biasa nya ga berubah, baru keliatan efek nya klo di compile trus nanti ngubah nya di registry

Roikhan Nasir 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 irsan 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

Roikhan Nasir 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..

Unknown 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 irsan 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