PRA KATA
Suatu saat adakalnya kita ingin mendapatkan informasi detail tentang suatu table, mulai dari nama kolom, tipe datanya serta atrribute yang lainnya. banyak hal yang bisa dilakukan dengan mengetahui infromasi "Schema" suatu table, salah satunya mungkin dengannya kita bisa membuat sebuah progam aplikasi untuk menggenerate script SQL seperti Insert, Update maupun delete, atau untuk keperluan lainnya.
PEMBAHASAN
Tulisan ini diperkaya dan dimodifikasi dari sumber berikut ini (How To Retrieve Column Schema Using the DataReader GetSchemaTable Method and Visual Basic .NET) dengan gaya pembahasan yg punya blog ini tentunya.
Untuk mendapatkan informasi seputar Column schema dari suatu tabel ada beberapa cara yang bisa dilakukan, pada tulisan ini kita akan memanfaatkan fasilitas ExecuteReader(commandBehavior) dari OleDBCommand.
Inti dari cara mendapatkan column schema dari suatu tabel adalah pada pemberian parameter dari fungsi ExecuteReader yaitu CommandBehavior, CommandBehavior adalah suatu enumeration yang memberikan gambaran mengenai hasil query dan efeknya pada database. Anggota dari CommandBehavior adalah sbb : CloseConnection, Default, KeyInfo, SchemaOnly, SequentialAccess, SingleResult dan SingleRow.
kemudian dari sekian banyak member CommandBehavior itu, mana yg sesuai dengan keinginan kita, yaitu untuk mendapatkan column schema dari suatu tabel?? jawabnya adalah hanya dua yaitu KeyInfo, SchemaOnly. Perbedaan antara penggunaan parameter enum Keyinfo dan SchemaOnly adalah sebagai berikut, jika kita menggunakan param enum KeyInfo query yang dihasilkan adalah berisi informasi kolom dan Primary Key dari suatu tabel, sedang jika yang kita gunakan param enum SchemaOnly maka query yang dihasilkan hanya berisi Informasi Kolom saja. uppss kayaknya cukup neh seputar teorinya, lebih lanjutnya tentang ExecuteReader dan commandBehaviour bisa langsung merujuk ke MSDN-nya.
Berikutnya kita akan mencoba mengimplementasikan sedikit teori diatas kedunia nyata(tentunya sesuia dengan tema kita diatas).
- Buatlah sebuah project baru(Windows Application) dari VS.Net 2005 atau yang lainnya
- Pada Form1 tambahkan komponen Berikut ini, dan atur letaknya sesui selera anda :) :
- Button, Name:Button1
- GridView, Name:Grid
- Tambahkan sebuah modul, beri nama modGlobal atau suka2 anda, modul ini berisi procedure dan function yang digunakan pada program utama, terdiri dari function GetSQLDataType(DataTypeNum) yang berfungsi untuk mendapatkan nama type data provider(dalam hal ini SLQ Server), karena pada schema yang tersedia hanya kode nomor dari Type Data Providernya saja, kemudian SetGridColText dan SetGridColCheckBox yang berfungsi untuk mensetting Column text dan Ceheck Box pada grid.. <* lumayan neh bonus tulisan, gw nyarinya lumayan susah neh, gw sharing gratis tiss, mudah2an ada yang berminat.. *>. kopikan kode program berikut ini pada modul yang anda buat:
Public Function GetSQLDataType(ByVal TheDataTypeNum As Integer) As String
Dim MyDTName As String = ""
Select Case TheDataTypeNum
Case 20 : MyDTName = "BigInt"
Case 128 : MyDTName = "Binary"
Case 11 : MyDTName = "Bit"
Case 129 : MyDTName = "Char"
Case 135 : MyDTName = "DateTime"
Case 131 : MyDTName = "Decimal"
Case 5 : MyDTName = "Float"
Case 205 : MyDTName = "Image"
Case 3 : MyDTName = "Int"
Case 6 : MyDTName = "Money"
Case 130 : MyDTName = "Nchar"
Case 203 : MyDTName = "Ntext"
Case 131 : MyDTName = "Numeric"
Case 202 : MyDTName = "Nvarchar"
Case 4 : MyDTName = "Real"
Case 135 : MyDTName = "SmallDateTime"
Case 2 : MyDTName = "SmallInt"
Case 6 : MyDTName = "SmallMoney"
Case 12 : MyDTName = "SQLVariant"
Case 201 : MyDTName = "Text"
Case 128 : MyDTName = "TimeStamp"
Case 17 : MyDTName = "TinyInt"
Case 72 : MyDTName = "UniqueIdentifier"
Case 204 : MyDTName = "VarBinary"
Case 200 : MyDTName = "Varchar"
End Select
Return MyDTName
End Function
Dim MyDTName As String = ""
Select Case TheDataTypeNum
Case 20 : MyDTName = "BigInt"
Case 128 : MyDTName = "Binary"
Case 11 : MyDTName = "Bit"
Case 129 : MyDTName = "Char"
Case 135 : MyDTName = "DateTime"
Case 131 : MyDTName = "Decimal"
Case 5 : MyDTName = "Float"
Case 205 : MyDTName = "Image"
Case 3 : MyDTName = "Int"
Case 6 : MyDTName = "Money"
Case 130 : MyDTName = "Nchar"
Case 203 : MyDTName = "Ntext"
Case 131 : MyDTName = "Numeric"
Case 202 : MyDTName = "Nvarchar"
Case 4 : MyDTName = "Real"
Case 135 : MyDTName = "SmallDateTime"
Case 2 : MyDTName = "SmallInt"
Case 6 : MyDTName = "SmallMoney"
Case 12 : MyDTName = "SQLVariant"
Case 201 : MyDTName = "Text"
Case 128 : MyDTName = "TimeStamp"
Case 17 : MyDTName = "TinyInt"
Case 72 : MyDTName = "UniqueIdentifier"
Case 204 : MyDTName = "VarBinary"
Case 200 : MyDTName = "Varchar"
End Select
Return MyDTName
End Function
Public Function SettGridColText(ByVal hdrText As String, ByVal hdrName As String, _
ByVal lbrCol As Integer , ByVal TheReadO As Boolean, ByVal AuMode As DataGridViewAutoSizeColumnMode, _
Optional ByVal VisibleCol As Boolean = True, Optional ByVal ContAllignment As DataGridViewContentAlignment = DataGridViewContentAlignment.BottomCenter) As DataGridViewTextBoxColumn
Dim TheCol As New DataGridViewTextBoxColumn
With TheCol
.HeaderText = hdrText
.Name = hdrName
.Width = lbrCol
.ReadOnly = TheReadO
.AutoSizeMode = AuMode
.Visible = VisibleCol
.DefaultCellStyle.Alignment = ContAllignment 'Contain Alligment
End With
Return TheCol
End Function
Public Function SettGridColCehckBox(ByVal hdrText As String, ByVal hdrName As String, _
ByVal lbrCol As Integer , ByVal TheReadO As Boolean, _
ByVal AuMode As DataGridViewAutoSizeColumnMode, _
Optional ByVal VisibleCol As Boolean = True, _
Optional ByVal ContAllignment As DataGridViewContentAlignment _
= DataGridViewContentAlignment.BottomCenter) As DataGridViewCheckBoxColumn
Dim TheCol As New DataGridViewCheckBoxColumn
With TheCol
.HeaderText = hdrText
.Name = hdrName
.Width = lbrCol
.ReadOnly = TheReadO
.AutoSizeMode = AuMode
.Visible = VisibleCol
.DefaultCellStyle.Alignment = ContAllignment 'Contain Alligment
End With
Return TheCol
End Function
- Kemudian pada form1 tambahkan kode program berikut ini
Private Sub SettGridView()
'No
Dim ColNo As New DataGridViewTextBoxColumn
ColNo = SettGridColText("No", "hdrNo", 25, True, DataGridViewAutoSizeColumnMode.None)
'Tax Name
Dim ColTaxName As New DataGridViewTextBoxColumn
ColTaxName = SettGridColText("Name", "hdrName", 150, True,_
DataGridViewAutoSizeColumnMode.None, True,_
DataGridViewContentAlignment.MiddleLeft)
'Prosentase
Dim ColProvDataType As New DataGridViewTextBoxColumn
ColProvDataType = SettGridColText("Prov DType", "hdrProvDataType", 80, True,_
DataGridViewAutoSizeColumnMode.None, True, _
DataGridViewContentAlignment.MiddleLeft)
Dim ColSysDataType As New DataGridViewTextBoxColumn
ColSysDataType = SettGridColText("Sys DType", "hdrSysDataType", 80, True,_
DataGridViewAutoSizeColumnMode.None, True,_
DataGridViewContentAlignment.MiddleLeft)
Dim ColLength As New DataGridViewTextBoxColumn
ColLength = SettGridColText("Length", "hdrLength", 50, True,_
DataGridViewAutoSizeColumnMode.None, True,_
DataGridViewContentAlignment.MiddleRight)
Dim ColPKey As New DataGridViewCheckBoxColumn
ColPKey = SettGridColCehckBox("PK", "hdrPkey", 40, False,_
DataGridViewAutoSizeColumnMode.None, True,_
DataGridViewContentAlignment.MiddleCenter)
Dim ColSelect As New DataGridViewCheckBoxColumn
ColSelect = SettGridColCehckBox("Select", "hdrSelect", 40, False,_
DataGridViewAutoSizeColumnMode.None, True,_
DataGridViewContentAlignment.MiddleCenter)
With grid
.Columns.Clear()
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.Columns.Add(ColNo)
.Columns.Add(ColTaxName)
.Columns.Add(ColProvDataType)
.Columns.Add(ColSysDataType)
.Columns.Add(ColLength)
.Columns.Add(ColPKey)
.Columns.Add(ColSelect)
End With
End Sub
Private Sub getSchema()
Dim cn As New OleDbConnection()
Dim cmd As New OleDbCommand()
Dim schemaTable As DataTable
Dim myReader As OleDbDataReader
Dim myField As DataRow
Dim myProperty As DataColumn
'Open a connection to the SQL Server Northwind database.
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=SERVER_ANDA;User ID=USER_SA_ANDA;Password=PASSWORD_SA_AND;Initial Catalog=Northwind"
cn.Open()
'Retrieve records from the Employees table into a DataReader.
cmd.Connection = cn
cmd.CommandText = "SELECT * FROM Employee"
myReader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)
'Retrieve column schema into a DataTable.
schemaTable = myReader.GetSchemaTable()
Dim iRow As Integer = 0
'For each field in the table...
For Each myField In schemaTable.Rows
'For each property of the field...
grid.Rows.Add()
grid.Item("hdrName", iRow).Value = myField.Item(0).ToString()
For Each myProperty In schemaTable.Columns
If myProperty.ColumnName = "DataType" Then
grid.Item("hdrProvDataType", iRow).Value = _
GetSQLDataType(Val(myField("ProviderType").ToString()))
grid.Item("hdrSysDataType", iRow).Value = myField("DataType").ToString()
grid.Item("hdrLength", iRow).Value = myField("ColumnSize").ToString()
End If
Next
iRow = iRow + 1
Next
myReader.Close()
cn.Close()
End Sub
- Terakhir pada button1 tambahkan kode berikut ini
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
Button1.Click
SettGridView()
getSchema()
End Sub
- Now Run programmnya, dan klik button 1 amati apa yg terjadi. Selamat berxperimen dan berimprovisasi, nanti kalo udah bisa kasih tau gw ya..
- Program lengkap dapat didownload disini
FINALLY
Akhir kata semoga bermanfaat.
SUMBER
1. MSDN Online
2. http://support.microsoft.com/kb/310108
Tidak ada komentar:
Posting Komentar