STMIKBG MATARAM

Situs Online Anak-Anak Bumi Gora

Archive for the ‘Visual Basic’


kill process dgn vb dan wmi

gara-gara kemarin kena worm yg bikin sakit hati, mau kill prosesnya tp malah tools untuk pake kill kena kill duluan. Terus kenapa tidak kepikiran, kenapa tidak buat sendiri kode yang bisa ngekill proses. Kalo dipikir juga caranya bagaimana?. Setelah dipikir-pikir kemarin kan sempat bahas masalah WMI, kenapa tidak memanfaatkan WMI aja untuk melakukan kill proses.

Untuk kodenya bisa dilihat dibawah ini

Public Sub KillProcess(byval processName as string)
        On Error GoTo ErrHandler
         Dim oWMI
         Dim ret
         Dim sService
         Dim oWMIServices
         Dim oWMIService
         Dim oServices
         Dim oService
         Dim servicename
          Set oWMI = GetObject("winmgmts:")
          Set oServices = oWMI.InstancesOf("win32_process")
          For Each oService In oServices
                serviceame = LCase(Trim(CStr(oService.Name) & ""))
                 If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
                    ret = oService.Terminate
                 End If
          Next
          Set oServices = Nothing
          Set oWMI = Nothing
ErrHandler:
  Err.Clear
End Sub

Untuk menggunakannya cukup ketik command KillProcess “winamp”

manipulasi data dalam dbgrid (MSDataGrid)

Untuk programer visual basic yang sering menggunakan grid standar dari microsoft ( msdatagrid OLEDB ) sering kali menemui kesulitan untuk memanipulasi data dalam grid dan mengeksekusi sub pencarian data. Misalnya untuk kasus saat ini kita akan mencoba membuat sebuah program kecil yang bisa menampilkan record pada grid, serta kita bisa melakukan pencarian record tertentu, seperti aplikasi basket belanja untuk POS.

Pada form yang dibuat sipengguna aplikasi bisa memasukkan kode barang pada column [kode barang] dan otomatis aplikasi melengkapi recordnya pada column berikutnya. Kita langsung masuk kekode program, pada kode program dibawah ini kita menggunakan beberapa recordset untuk melakukan retrieve data pada database.

Option Explicit
Dim Conn As ADODB.Connection
Dim RsBarang As ADODB.Recordset
Dim RsPenjualan As ADODB.Recordset

Dim StrBarang As String
Dim StrPenjualan As String

Selain itu kita juga akan membuat beberapa sub yang memanfaatkan beberapa event seperti Form_Load dan AfterColEdit untuk gridnya.

 Private Sub Form_Load()
 Set Conn = Nothing
 Set Conn = New ADODB.Connection
 Conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;" & _
                         "User ID=sa;Initial Catalog=PesonaHijau;Data Source=localhost"
 Conn.CursorLocation = adUseClient
 Conn.Open

  Set RsPenjualan = Nothing
 Set RsPenjualan = New ADODB.Recordset
 StrPenjualan = "Delete From Temp_Jual"
 RsPenjualan.Open StrPenjualan, Conn, adOpenDynamic, adLockOptimistic

 Set RsPenjualan = Nothing
 Set RsPenjualan = New ADODB.Recordset
 StrPenjualan = "Select * From Temp_Jual"
 RsPenjualan.Open StrPenjualan, Conn, adOpenDynamic, adLockOptimistic
 Set GridPenjualan.DataSource = RsPenjualan
 GridPenjualan.TabAction = dbgGridNavigation

 Set RsBarang = Nothing
 Set RsBarang = New ADODB.Recordset
 StrBarang = "Select * From Barang"
 RsBarang.Open StrBarang, Conn, adOpenDynamic, adLockOptimistic
 End Sub

Dan pada grid memanfaatkan event aftercoledit.

Private Sub GridPenjualan_AfterColEdit(ByVal ColIndex As Integer)
If ColIndex = 0 Then
  Set RsBarang = Nothing
  Set RsBarang = New ADODB.Recordset
  StrBarang = "Select * From Barang Where [Kode Barang] = '" & _
              Trim(GridPenjualan.Columns(0).Value) & "'"
  RsBarang.Open StrBarang, Conn, adOpenDynamic, adLockOptimistic
  If RsBarang.RecordCount <> 0 Then
   GridPenjualan.Columns(1).Value = Trim(RsBarang.Fields("Nama Barang").Value)
   GridPenjualan.Columns(2).Value = 1
   RsPenjualan.Requery
   RsPenjualan.MoveLast
   GridPenjualan.Row = RsPenjualan.RecordCount
   GridPenjualan.CurrentCellModified = True
  Else
   RsPenjualan.CancelBatch adAffectCurrent
   RsPenjualan.Requery
   RsPenjualan.MoveLast
  End If
 End If
End Sub

ADO 2.7 Array Error

Secara tidak sengaja saya menemukan kesalahan pada ADODB versi 2.7 yakni kesalahan array, kesalahan array disini maksudnya kita tidak bisa mengambil nilai yang tersimpan dari recordset secara acak, Misalnya pada code berikut ini :

Private Sub CboSuplier_Click()
 Set RsSuplier = Nothing
 Set RsSuplier = New ADODB.Recordset
 StrSuplier = "Select [Suplier Id],[Suplier Name] " & _
              "From Suplier Where [Suplier Id] = '" & _
              Trim(CariKodeData(CboSuplier.Text)) & "'"
 RsSuplier.Open StrSuplier, Conn, adOpenDynamic, adLockOptimistic
 If RsSuplier.RecordCount <> 0 Then
  TxtNamaSuplier.Text = Trim(RsSuplier.Fields("Suplier Name").Value)
  TxtKodeSuplier.Text = Trim(RsSuplier.Fields("Suplier Id").Value)
 End If
End Sub

Akan terjadi kesalahan “Run-time Error ‘3201′ Either BOF or EOF is true, or the current record has been deleted. Requested operation requires is current record“, sebenarnya kesalahan ini terjadi karena kita mengambil data pada recordset (membinding data dari recordset ke control textbox) dilakukan secara acak (tidak berurutan) jika kita perhatikan kode listing diatas tidak bermasalah secara logical. Tetapi jika binding dilakukan secara berurutan permahasalah diatas tidak akan terjadi seperti code dibawah ini

If RsSuplier.RecordCount <> 0 Then
  TxtKodeSuplier.Text = Trim(RsSuplier.Fields("Suplier Id").Value)
  TxtNamaSuplier.Text = Trim(RsSuplier.Fields("Suplier Name").Value)
End If

Berurutan maksudnya disini sesuai urutan field yang dilakukan saat query.

 StrSuplier = "Select [Suplier Id],[Suplier Name] " & _
              "From Suplier Where [Suplier Id] = '" & _
              Trim(CariKodeData(CboSuplier.Text)) & "'"

Semoga programer lainnya yang menggunakan ADO 2.7 bisa terbantu dari tulisan ini.

connection string untuk ado

Saat kita membuat aplikasi, adakalanya kita terbentur dengan pilihan database, apakah harus menggunakan dbms lisense atau free dbms. Jika project yang kita tangani budgetnya besar tidak masalah jika kita menggunakan DBMS sekelas MS-SQL, Oracle atau mungkin DBnya IBM, tetapi ketika dana adalah sebuah kendala maka salah satu solusi untuk memangkas biaya yakni menggunakan DBMS gratisan seperti mySQL, FireBird atau free dbms lainnya.

Bagi pengguna ADO/ ADO.NET untuk melakukan koneksi keberbagai DBMS alternatif sering terbentur pada provider conectionnya, atau mungkin juga tidak mengetahui connection string yang tepat untuk berbagai DBMS alternatif tersebut.

Misalnya pilihan jatuh kepada mySQL, maka ada beberapa metode connection string yang bisa dipilih antara lain :

mySQL with ODBC

strConnect = _T("Driver={mySQL ODBC 3.51 Driver};" & _
             "Server=MyRemoteHost;" & _
             "Port=3306;Option=4;Database=MyDatabase;" & _
             "Uid=MyUsername;Pwd=MyPassword;");

Dimana option ini antara lain :

  • 1 - The client can’t handle that MyODBC returns the real width of a column.
  • 2 - The client can’t handle that MySQL returns the true value of affected rows. If this flag is set then MySQL returns ‘found rows’ instead. One must have MySQL 3.21.14 or newer to get this to work.
  • 4 - Make a debug log in c:\myodbc.log. This is the same as putting MYSQL_DEBUG=d:t:O,c::\myodbc.log in AUTOEXEC.BAT.
  • 8 - Don’t set any packet limit for results and parameters.
  • 16 - Don’t prompt for questions even if driver would like to prompt.
  • 32 - Enable or disable the dynamic cursor support. This is not allowed in MyODBC 2.50.
  • 64 - Ignore use of database name in ‘database.table.column’.
  • 128 - Force use of ODBC manager cursors (experimental).
  • 256 - Disable the use of extended fetch (experimental).
  • 512 - Pad CHAR fields to full column length.
  • 1024 - SQLDescribeCol() will return fully qualified column names.
  • 2048 - Use the compressed server/client protocol.
  • 4096 - Tell server to ignore space after function name and before ‘(’ (needed by PowerBuilder). This will make all function names keywords!
  • 8192 - Connect with named pipes to a MySQLd server running on NT.
  • 16384 - Change LONGLONG columns to INT columns (some applications can’t handle LONGLONG).
  • 32768 - Return ‘user’ as Table_qualifier and Table_owner from SQLTables (experimental).
  • 65536 - Read parameters from the client and ODBC groups from my.cnf.
  • 131072 - Add some extra safety checks (should not be needed but…).

Jika anda menggunakan OLEDB maka connection string untuk mySQL seperti dibawah ini :

 strConnection = _T("Provider=MySQLProv;" & _
                              "Server=localhost;"  & _
                              "Database=MyDatabase;" & _
                              "User=MyUserName;" & _
                              "Password=MyPassword")

Untuk ODBC download file myodbc.x.x ( x versi driver ) dan OLEDB download driver mySQLprovider.

Menggunakan WMI

Hari ini ada sedikit keisengan yang disarankan sama erwin aka moonbluez and adit` aka nyem yakni bagaimana kita bisa mengakses windows management instrument (WMI) pada komputer remote, Bicara WMI kayaknya baru kali ini, gw jadi penasaran. Setelah gw tanya ke mbah google akhirnya gw ada sedikit bayangan dan yang paling banyak adalah keterkejutan gw, bayangkan dengan WMI kita bisa mendapatkan informasi apapun pada komputer yang menjalankan system operasi windows.

Bayangkan dengan WMI anda bisa melihat proses list, type procesor dan kecepatan processor, keadaan memory, besar kapasitas hardisk yang ada dikomputer dan kemampuan lainnya dengan perintah WQL, contohnya

'untuk melihat process list
Select * From Win32_Process

Dengan berbekal sedikit bahasa pemerograman visual basic anda bisa membuat sebuah tools untuk mengakses WMI seperti contoh dibawah ini

' Full Computer Name
' can be found by right-clicking My Computer,
' then click Properties, then click the Computer Name tab)
' or use the computer's IP address
strComputer = "FullComputerName"
strDomain = "DOMAIN"
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
    "root\cimv2", _
     strUser, _
     strPassword, _
     "MS_409", _
     "ntlmdomain:" + strDomain)
Set colSwbemObjectSet = _
    objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
    Wscript.Echo "Process Name: " & objProcess.Name
Next

untuk vb.net code seperti dibawah ini

Imports System
Imports System.Management
Public Class RemoteConnect

    Public Overloads Shared Function Main( _
    ByVal args() As String) As Integer
    Dim scope As ManagementScope
        scope = New ManagementScope( _
            "\\FullComputerName\root\cimv2")
        scope.Connect()
    Dim query As ObjectQuery
        query = new ObjectQuery( _
            "SELECT * FROM Win32_OperatingSystem")
    Dim searcher As ManagementObjectSearcher
        searcher = _
            New ManagementObjectSearcher(scope, query)
    Dim queryCollection As ManagementObjectCollection
        queryCollection = searcher.Get()
    Dim m As ManagementObject
        For Each m In queryCollection
            ' Display the remote computer information
            Console.WriteLine("Computer Name : {0}", _
                m("csname"))
            Console.WriteLine("Windows Directory : {0}", _
                m("WindowsDirectory"))
            Console.WriteLine("Operating System: {0}", _
                m("Caption"))
            Console.WriteLine("Version: {0}", m("Version"))
            Console.WriteLine("Manufacturer : {0}", _
                m("Manufacturer"))
        Next
        Return 0
    End Function
End Class

Kemungkinan saat menjalankan WMI tools secara remote anda akan diblok biasanya ada pesan “RPC Server unavailable” untuk troubleshot masalah tersebut anda bisa menonaktifkan windows firewall atau ketik command berikut pada remote komputer Netsh firewall set service RemoteAdmin

Terdapat juga beberapa error seperti “Access denied”, untuk mengatasi masalah ini anda bisa menjalankan secpol.msc dan pada section Local Policies - Security Options - Network access jika diset Guest only anda harus memasukkan ke mode Classic dan restart komputer anda.