{heroes}... i wish, i was

October 2008 - Posts

  • Report Builder 2.0 Released!

    image

    Folks,

    Report Builder 2.0 sudah di-release pada tanggal 17 Oktober yang lalu. Beritanya bisa dilihat disini, untuk mulai men-download bisa langsung kesini.

    Share this post: | | | |
  • Invitation : TechNet SQL Server 2008 | Database Infrastructure Scalability

    Dear All,

    Berikut adalah undangan event TechNet SQL Server 2008 | Database Infrastructure Scalability yang akan digelar pada 22 Oktober 2008.

    technet-SQLserver08--22okt-800

    Untuk registrasi dan informasi lainnya, silakan kirim email ke dpeevent@hotmail.com

    Share this post: | | | |
  • SSIS untuk Developer .net

    Di kantor saya terdapat dua divisi yaitu development dan Business Intelligence (BI) dan saya masuk dalam divisi development. Setahun yang lalu bos BI meminta saya untuk bergabung dengan divisinya. Sebagai orang yang sudah devoted to .net, tentu saja saya menolaknya dengan alasan kalau saya nggak bisa sama sekali SQL stuff seperti query, tuning, OLAP atau ETL. Terlebih waktu itu ada banyak hal baru yang sedang dan akan happening di .net seperti LINQ, Silverlight dan WPF.

    Lalu bos saya bercerita kenapa dia membutuhkan developer .net di divisinya. Menurut beliau, di SQL Server ada banyak hal yang apabila dikerjakan dengan PL/SQL sulit sekali untuk dilakukan atau bermasalah dengan performance (seperti penggunaan cursor) tetapi apabila dikerjakan dengan .net akan jauh lebih mudah atau lebih cepat secara performance. Di SQL Server sendiri terdapat SDK yang memudahkan developer untuk (apa yah bahasa yang tepat) berinteraksi dengan SQL dan setiap services yang ada di SQL Server bisa kita code dari .net. Beliau juga menambahkan bahwa masih sedikit developer yang meng-explore SQL (masa sih ?), so the competition is like in the blue ocean instead in the red ocean.

    Karena secara sepihak (huhuhu) sudah diputuskan bahwa saya harus masuk divisi BI akhirnya title saya pun berubah dari .net developer menjadi BI developer dan saya diberi tugas untuk menangani SSIS atau SQL Server Integration Services. Kenapa SSIS? Saya sendiri nggak tau (hehe), tapi kalau lihat gambar di bawah ini, saya mengambil kesimpulan (mungkin) karena SSIS seperti namanya adalah service yang digunakan untuk melakukan integrasi antara service-service yang ada di SQL Server. Ditambah banyak hal di SSIS yang bisa di-extend dengan .net.

    Sekarang kita lihat object model nya.

    Secara garis besar sebuah SSIS package dibagi kedalam dua bagian yaitu control flow dan data flow. Control flow adalah bagian dimana kita bisa melakukan task-task seperti mengeksekusi package yang lain, mengeksekusi aplikasi lain seperti yang saya contohkan pada saat bekerja dengan secure ftp, atau melakukan looping. Sedangkan data flow digunakan untuk perpindahan dan transformasi data dimana terdapat tiga elemen didalamnya yaitu source, transformation dan destination.

    So where's the .net stuff? Di control flow, terdapat Script Task apabila kita membutuhkan fungsi yang tidak terdapat di built-in extensions yang ada di control flow, contohnya seperti mengakses user yang terdapat di Active Directory. Sementara di data flow, terdapat Script Component yang dapat kita digunakan misalnya untuk memvalidasi data dengan business rule yang kita punya di assembly .net. Kedua extension tersebut kita isi dengan code VB atau C#, khusus untuk C# baru ada sejak SQL Server 2008. Dan keduanya konon adalah hal yang jarang dipakai oleh developer BI/SQL karena jarang diantara mereka yang bisa coding menggunakan VB atau C#.

    Hal terbaiknya (dan ini adalah satu dari banyak feature yang bikin saya kecanduan SSIS) adalah apabila ternyata kedua extension tadi kita buat berulang-ulang (atau copy paste berulang, yang nggak baik untuk sebuah SSIS package karena code nya yang panjang bikin ukuran file-nya membesar), kita dapat melakukan refactoring (tepat nggak yah istilahnya?) terhadap code tersebut dengan cara membuat Custom Task atau Custom Component. Gambar di bawah ini adalah screen capture dari project saya, dimana component yang saya beri lingkaran merah adalah built-in component SSIS sementara sisanya adalah custom component yang saya buat.

    Kita juga bisa membuat custom application untuk mengenerate SSIS package, memvalidasinya, dan bahkan mengeksekusinya. Sebagai tambahan, screen capture diatas adalah sebuah SSIS package yang saya generate dengan aplikasi yang saya buat sendiri.

    Yah, setelah setahun saya bekerja di divisi BI ternyata banyak hal di SQL Server (terutama SSIS untuk saya), yang dapat dibuat dengan menggunakan .net seperti yang saya tunjukkan pada saat membuat stored procedure dengan .net. Dan tulisan ini adalah bagian pembuka dari tulisan-tulisan saya berikutnya tentang bagaimana kita bisa membantu para developer BI/SQL dengan .net.

    Share this post: | | | |
    Posted Oct 07 2008, 09:55 AM by si_hendrik with no comments
    Filed under:
  • Membuat Stored Procedure dengan .net

    Download source C# | Download source VB

    Sebagai developer .net, pekerjaan yang paling saya takuti adalah membuat stored procedure. Daripada menggunakan stored procedure, saya lebih memilih untuk menulis semua code nya menggunakan .net. Tapi itu dulu, sebelum SQL Server 2005 datang. Sekarang, stored procedure dapat dibuat dengan menggunakan .net, sebutannya CLR Stored Procedure.

    Pada kesempatan yang berbahagia ini (halah apalagi, kayak ceramah aja), saya akan membuat stored procedure yang fungsinya untuk meng-ekspor hasil query ke text file, lalu men-deploy stored procedurenya ke SQLServer. Contohnya dibuat dengan Visual Studio .net 2008, lalu di-deploy ke SQL Server 2008 RTM.

    Buat satu class library dengan nama ExportQuery

    Ubah nama file Class1.vb menjadi ExportQueryProc.vb, atau Class1.cs menjadi ExportQueryProc.cs. Apabila muncul dialog box konfirmasi untuk me-rename element Class1, klik Yes.

    Tambahkan import statement (untuk VB) atau using statement (C#) ke System, System.IO, System.Data, System.Data.SqlClient dan Microsoft.SqlServer.Server.

    C#

    using System;

    using System.IO;

    using System.Data;

    using System.Data.SqlClient;

    using Microsoft.SqlServer.Server;

     

    VB

    Imports System

    Imports System.IO

    Imports System.Data

    Imports System.Data.SqlClient

    Imports Microsoft.SqlServer.Server

     

    Tambahkan static method ExportToTextFile pada class ExportQueryProc seperti code dibawah

    C#

    [Microsoft.SqlServer.Server.SqlProcedure]

    public static void ExportToTextFile(string sqlQuery, string filePath, char delimiter)

    {

    try

    {

    if (File.Exists(filePath))

    {

    File.Delete(filePath);

    }

    using (SqlConnection connection = new SqlConnection("context connection = true"))

    {

    connection.Open();

    SqlCommand command = connection.CreateCommand();

    command.CommandText = sqlQuery;

    SqlDataReader reader = command.ExecuteReader();

    DataTable table = reader.GetSchemaTable();

    int numberOfColumns = table.Rows.Count - 1;

    int rowCount = 0;

    string content = string.Empty;

     

    foreach (DataRow row in table.Rows)

    {

    content += string.Format("{0}{1}", row["ColumnName"], delimiter);

    }

    File.AppendAllText(filePath, content.Trim(delimiter) + System.Environment.NewLine );

     

    while (reader.Read())

    {

    content = string.Empty;

    for (int columnNumber = 0; columnNumber <= numberOfColumns; columnNumber++ )

    {

    content += string.Format("{0}{1}", reader.GetValue(columnNumber), delimiter);

    }

     

    System.IO.File.AppendAllText(filePath,content.Trim(delimiter) + System.Environment.NewLine );

    rowCount++;

    }

     

    connection.Close();

    SqlContext.Pipe.Send(string.Format("{0} telah diekspor ke {1}", rowCount, filePath));

    }

    }

    catch (Exception ex)

    {

    SqlContext.Pipe.Send(ex.Message);

    }

    }

     

    VB

    <Microsoft.SqlServer.Server.SqlProcedure()> _

    Public Shared Sub ExportToTextFile(ByVal sqlQuery As String, ByVal filepath As String, ByVal delimiter As Char)

    Try

    If File.Exists(filepath) Then

    File.Delete(filepath)

    End If

     

    Using connection As New SqlConnection("context connection = true")

    connection.Open()

    Dim command As SqlCommand = connection.CreateCommand()

    command.CommandText = sqlQuery

    Dim reader As SqlDataReader = command.ExecuteReader()

    Dim table As DataTable = reader.GetSchemaTable()

    Dim numberOfColumns As Integer = table.Rows.Count - 1

    Dim rowCount As Integer = 0

    Dim content As String = String.Empty

     

    For Each row As DataRow In table.Rows

    content += String.Format("{0}{1}", row("ColumnName"), delimiter)

    Next

    System.IO.File.AppendAllText(filepath, content.Trim(delimiter) + vbNewLine)

     

    While reader.Read

    content = String.Empty

    For columnNumber As Integer = 0 To numberOfColumns

    content += String.Format("{0}{1}", reader.GetValue(columnNumber), delimiter)

    Next

     

    System.IO.File.AppendAllText(filepath, content.Trim(delimiter) + vbNewLine)

    rowCount += 1

    End While

     

    connection.Close()

    SqlContext.Pipe.Send(String.Format("{0} row telah diekspor ke {1}", rowCount, filepath))

    End Using

    Catch ex As Exception

    SqlContext.Pipe.Send(ex.Message)

    End Try

    End Sub

     

    Buat strong name dengan nama ExportQuery.snk, lalu build Solution

    Buka SQL Server Management Studio, login ke database tempat stored procedure akan di-deploy, set 'clr enabled' menjadi 1

    sp_configure 'clr_enabled', 1

    go

    reconfigure

     

    Deploy stored procedure dengan script berikut. Sebelum di-execute, ubah nilai variable @assemblyPath dengan path assembly ExportQuery.dll.

    USE master

    declare @assemblyPath as varchar(max) = 'C:\ExportQuery\ExportQuery.dll'

    exec('CREATE ASYMMETRIC KEY ExportQuery_Key FROM EXECUTABLE FILE = ''' + @assemblyPath + '''')

     

    CREATE LOGIN ExportQuery_Login FROM ASYMMETRIC KEY ExportQuery_Key

     

    GRANT UNSAFE ASSEMBLY TO ExportQuery_Login

     

    USE AdventureWorks

    CREATE ASSEMBLY ExportQuery from @assemblyPath WITH PERMISSION_SET = external_access

     

    go

    CREATE PROCEDURE ExportToTextFile(@query nvarchar(max), @filepath nvarchar(max), @delimiter nchar)

    AS

    EXTERNAL NAME ExportQuery.[ExportQuery.ExportQueryProc].ExportToTextFile

     

    Untuk mengetes hasilnya, jalankan script berikut. Sebelum dijalankan, pastikan user account yang digunakan sebagai service SQL Server memiliki akses write ke folder dimana query akan diekspor.

    use AdventureWorks

    EXEC exporttotextfile 'SELECT * FROM humanresources.department','c:\department.txt',';'

    Share this post: | | | |
  • LINQ + SMO = LOVE ?

    Download C# code | Download VB code | Download ServerConnect C# | Download ServerConnect VB

    This is it guys, my first LINQ code. Huh? I bet you're all gonna say, where have you been? Heheh, iya yah saya kemana aja yah? Ada kok, disini. Anyway, kemarin saya habis nonton video My First LINQ Queries by Beth Massi. Dia kasih contoh gimana cara nge-query isi file yang ada di komputer pake LINQ. Wow, LINQ itu powerful banget yah, saya jadi terinspirasi (halah terinspirasi, maksud lu?) buat nge-query objek2 yang ada di SQL Server pake LINQ. Tenang2, saya bikin nya gak yang susah2 kok. Cuman query database yang ada di satu server ajah, dan bisa dipilih apakah mau ambil system database atau user database.

    Bahan2 yang dibutuhkan:

    Microsoft Visual Studio .NET 2008

    Microsoft SQL Server SDK

    Microsoft SQL Server 2005 Express

     

    Yang harus kita kerjakan:

    Buat satu windows forms application baru dan beri nama LINQSMO

    Tambahkan project ServerConnect ke dalam solution

    Add reference ke Microsoft.SqlServer.Smo, Microsoft.SqlServer.ConnectionInfo, dan ExceptionMessageBox untuk project LINQSMO

    Add reference ke project ServerConnect

    Pada Form1 tambahkan Button dengan nama btnSystemTable, location 0,0, width 150 px dan beri text System Table

    Tambahkan Button dengan nama btnUserDefineTable, location 156,0, width 150 px dan beri text User Define Table

    Tambahkan DataGridView dengan nama dgTable, location 0,29, size 306, 232

    Buka code form1, tambahkan import statement (untuk VB) atau using statement (untuk C#) Microsoft.SqlServer.Management.Smo, Microsoft.SqlServer.Management.Common, Microsoft.SqlServer.MessageBox dan Microsoft.Samples.SqlServer.

    C#

    using Microsoft.SqlServer.Management.Smo;

    using Microsoft.SqlServer.Management.Common;

    using Microsoft.SqlServer.MessageBox;

    using Microsoft.Samples.SqlServer;

     

    VB

    Imports Microsoft.SqlServer.Management.Smo

    Imports Microsoft.SqlServer.Management.Common

    Imports Microsoft.SqlServer.MessageBox

    Imports Microsoft.Samples.SqlServer

     

    Tambahkan variable _server dengan tipe data Server di Form1

    C#

    private Server _server;

     

    VB

    Private _server As Server

     

    Tambahkan event handler pada saat form load untuk memanggil ServerConnect

    C#

    private void Form1_Load(object sender, EventArgs e)

    {

    ServerConnection ServerConn = new ServerConnection();

    ServerConnect scForm;

    DialogResult dr;

     

    this.Show();

    ServerConn = new ServerConnection();

    scForm = new ServerConnect(ServerConn);

    dr = scForm.ShowDialog(this);

    if ((dr == DialogResult.OK) &&

    (ServerConn.SqlConnectionObject.State == ConnectionState.Open))

    {

    _server = new Server(ServerConn);

    if (_server != null)

    {

    this.Text = _server.Name;

    }

    }

    else

    {

    this.Close();

    }

    }

     

    VB

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim ServerConn As New ServerConnection()

    Dim scForm As ServerConnect

    Dim dr As DialogResult

     

    Me.Show()

    ServerConn = New ServerConnection()

    scForm = New ServerConnect(ServerConn)

    dr = scForm.ShowDialog(Me)

    If dr = Windows.Forms.DialogResult.OK AndAlso ServerConn.SqlConnectionObject.State = ConnectionState.Open Then

    _server = New Server(ServerConn)

    If Not (_server Is Nothing) Then

    Me.Text = _server.Name

    End If

    Else

    Me.Close()

    End If

    End Sub

     

    Buat method untuk nge-query database yang ada di server (ini dia nih LINQ-nya), beri parameter Boolean isSystemObject untuk memfilter system database dan user database

    C#

    private void RetrieveTable(bool isSystemObject)

    {

    try

    {

    var databases = from Database database in _server.Databases

    where database.IsSystemObject == isSystemObject

    select new {database.Name, database.Owner};

     

    dgTable.DataSource = databases.ToList();

    }

    catch (Exception ex)

    {

    ExceptionMessageBox exMessageBox = new ExceptionMessageBox(ex);

    exMessageBox.Show(this);

    }

    }

     

    VB

    Private Sub RetrieveTable(ByVal isSystemObject As Boolean)

    Try

    Dim databases = From database As Database In _server.Databases _

    Where database.IsSystemObject = isSystemObject _

    Select database.Name, database.Owner

     

    dgTable.DataSource = databases.ToList

    Catch ex As Exception

    Dim exMessageBox As New ExceptionMessageBox(ex)

    exMessageBox.Show(Me)

    End Try

    End Sub

     

    Tambahkan event handler OnClick untuk btnSystemTable dan panggil method RetrieveTable dengan parameter true. Untuk btnUserTable parameter nya false

    C#

    private void btnSystemTable_Click(object sender, EventArgs e)

    {

    RetrieveTable(true);

    }

     

    private void button1_Click(object sender, EventArgs e)

    {

    RetrieveTable(false);

    }

     

    VB

    Private Sub btnSystemTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSystemTable.Click

    RetrieveTable(True)

    End Sub

     

    Private Sub btnUserTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUserTable.Click

    RetrieveTable(False)

    End Sub

     

    Selesai sudah, aplikasi kita siap untuk dijalankan. I LINQ it.

    Share this post: | | | |
    Posted Oct 06 2008, 09:36 AM by si_hendrik with no comments
    Filed under: ,