Makale Özeti

Veritabanı bağlantıları oluşturmak genellikle sıradan, rutin bir işlem gibi görülsede SQL Server temelli uygulamaların temelinde yer alır. Bu nedenle bağlantı oluşturma konusunu ayrı bir başlık altında ele alıyoruz. Bu bölümde SQL Server temelli .NET uygulamalarında NT ve SQL authentication kullanarak bağlantı kurma ve oluşacak hataları yakalama konularını ele alıyor olacağız ve bölümün sonunda kullanıcının, SQL Server bağlantısı için programın kullanacağı bağlantı türünü (NT veya SQL authentication) kendi seçebileceği bir örnek geliştiriyor olacağız.  

Makale


2 - Bağlantı Oluşturma

Veritabanı bağlantıları oluşturmak genellikle sıradan, rutin bir işlem gibi görülsede SQL Server temelli uygulamaların temelinde yer alır. Bu nedenle bağlantı oluşturma konusunu ayrı bir başlık altında ele alıyoruz. Bu bölümde SQL Server temelli .NET uygulamalarında NT ve SQL authentication kullanarak bağlantı kurma ve oluşacak hataları yakalama konularını ele alıyor olacağız ve bölümün sonunda kullanıcının, SQL Server bağlantısı için programın kullanacağı bağlantı türünü (NT veya SQL authentication) kendi seçebileceği bir örnek geliştiriyor olacağız.  

Integrated Security ile Oturum Açma
Bu bölümde, SQL Server üzerindeki Northwind örnek veritabanına Windows NT Authentication kullanarak oturum açmayı gösteren bir örnek üzerinde çalışacağız.  

“Uygulamamızda veri kaynağı olarak SQL Server kullanılacağından uygulamamızın bu veri kaynağına erişebilmesi için gerekli nesne ve metodları bize sunan System.Data.SqlClient  namespaceini uygulamamıza dahil etmek için modülümüzün en üstüne Imports System.Data.SqlClient ifadesini ekliyoruz.”

Imports System.Data.SqlClient
 

    Sub IntegratedCnnToNorthwind()

        Bağlantı, kullanıcının windows’a oturum açarken kullandığı

        kullanıcı hesabı ile kurulacak. Dolayısıyla kullanıcının Windows

        kullanıcı hesabının SQL Server’a ve sunucudaki
        Northwind veritabanına

        erişim hakkının olması gerekiyor.

        Dim con As SqlConnection = _

            New SqlConnection("Data Source=(local);" & _

            "Initial Catalog=northwind;Integrated Security=SSPI")

        Northwind veritabanını kullanıcının NT kullanıcı
        hesabı ile açıyoruz

        con.Open()

        ConnectionString’i Debug penceresine yazdırıyoruz

        (veya bir mesaj kutusu ile görüntüleyebiliriz)

        Debug.WriteLine(con.ConnectionString)

        MsgBox(con.ConnectionString)

 

        Bağlantıyı kapatıyoruz (sistem kaynakları bizim için önemli :)

        con.Close()

    End Sub

 

Yukarıdaki ifadeyi inceleyelim;
Birinci satırda yeni bir SqlConnection nesnesi oluşturuyor ve ConnectionString’i Windowsta oturum açtığımız kullanıcı bilgileri ile bağlanacak şekilde belirliyoruz.
Sonraki satırda oluşturduğumuz connectionstringi kullanarak bağlantıyı açmak için SqlConnection nesnesinin Open metodunu kullanıyoruz.

Daha sonra Debug penceresine bağlantı satırını yazdırıyoruz.

Son olaraksa açtığımız bağlantıyı kapatıyoruz.

“MSDE 2000 (Microsoft SQL Server 2000 Desktop Engine) Northwind örnek veritabanını içermemektedir, dolayısıyla bu örnekteki veritabanı adını MSDE kullanmanız durumunda geçerli bir veritabanı adı ile değiştirmeniz gerekmektedir.”

SQL Server Security ile Bağlantı Oluşturma
NT Authentication her zaman için önerilen yöntem olsa da bazı durumlarda SQL Authentication kullanmak gerekli (veya daha doğru) olabilir. Bu bölümse SQL Authentication kullanarak bağlantı oluşturma işleminin söz dizimini görüyor olacağız..

Kodu incelemeden önce SQL Server üzerinde kullanılacak SQL Server kullanıcı hesabının varolduğundan emin olmalıyız. Eğer kullanabileceğimiz bir SQL Server hesabı varsa aşağıdaki kodu incelemeye (ve kendi sunucunuz için düzenlemeye) geçebilirsiniz. Eğer yoksa önce nasıl bir kullanıcı hesabı oluşturabileceğimizi görelim.

Aşağıdaki SQL Scripti, think adlı bir SQL Serer hesabı (önce var olup olmadığını denetler, eğer varsa önce kullanıcı hesabını siler) oluşturur. Daha sonra oluşturulan “think” adlı hesaba Northwind veritabanına erişim hakkı verir. Aşağıdaki scripti Query Analyzer’da çalıştırarak örneğimizde kullanacağımız “think” adlı kullanıcı hesabının SQL Server’da “12345” parolasıyla (yoksa) oluşturulmasını ve Northwind veritabanına erişim hakkı verilmesini sağlayabilirsiniz.

--eğer varsa think hesabını sil
--kullanıcı hesabının varolmadığına dair bir mesaj çıkarsa
--dikkate almayalım
USE Northwind
EXEC sp_revokedbaccess think
EXEC sp_droplogin 12345
--think kullanıcı hesabını oluştur ve
--Northwind veritabanına erişim hakkı ver
USE Northwind
EXEC sp_addlogin
    @loginame = think,
    @passwd = 12345,
    @defdb = Northwind
EXEC sp_grantdbaccess think

 

Bu örnekte veritabanı bağlantısını SqlServerCnnToNorthwind adlı prosedür gerçekleştiriyor olacak. Bu prosedür aslında öncekine oldukça benziyor. İki prosedür arasındaki fark, SqlConnection nesnesinin ConnectionString özelliğine verdiğimiz değer. Bu prosedür, bir önceki örnekteki “Integrated Security” ifadesini, “user id” ve “password” ifadeleri ile değiştiriyor. Aşağıdaki prosedür, yukarıdaki SQL Scripti ile oluşturduğumuz “think” adlı SQL Server accountunu kullanarak bağlantı oluşturacaktır.

 

Sub SQLServerCnnToNorthwind()
    ConnectionString oluşturuluyor
    Dim str1 As String = "Data Source=(local);" & _
        "Initial Catalog=northwind;" & _
        "user id = think; password=12345"
    Dim con As SqlConnection = _
        New SqlConnection(str1)
    Bağlantıyı açıyoruz
    con.Open()
    Debug ekranına connectionstring i yazdırıyoruz
    Debug.WriteLine(con.ConnectionString)
    Bağlantıyı kapatıyoruz
    cnn1.Close()
End Sub

SqlConnection Hatalarının Yakalanması
Veritabanı işlemleri gerçekleştirirken pek çok nedenden dolayı çalışma zamanı hatalarıyla karşılaşabiliriz. Bu bölümde, veritabanı bağlantısı esnasında karşılaşabileceğimiz hataları, bu hataların yakalanmasını ve hata oluşması durumunda istenilen işlemlerin gerçekleştirilmesini ele alıyor olacağız. Aşağıdaki T-SQL Scripti think ve guest kullanıcı hesaplarının Northwind veritabanı üzerindeki tüm haklarını kaldırır. Bu nedenle think hesabı, sql server’a erişebilecek ancak northwind veritabanına erişemeyecektir.

--Aşağıdaki script think ve guest accountlarının
--northwind veritabanına erişim haklarını kaldıracak
--ve think kullanıcı hesabını silecektir.
EXEC sp_revokedbaccess think
EXEC sp_revokedbaccess guest
EXEC sp_droplogin @loginame = think

 

Bu scripti çalıştırdıktan sonra SqlServerCnnToNorthwind prosedürünü çalıştırmanız halinde aşağıdaki hata ekranı ile karşılaşırsınız.

 


Şekil 2:1 – Geçersiz bir SQL Server hesabı ile bağlantı denemesi yapıldığında karşılaşılan hata ekranı

 

Bağlantı hatalarının güzel yanı, bağlantı başarısızlıkla sonuçlandığında her farklı hata nedeni için farklı bir hata kodu ve açıklama mesajı geri döner. Aşağıdaki prosedürle bağlantının başarısızlıkla sonuçlanması durumunda kullanıcımızın standart hata ekranı ile karşılaşmamasını sağlamak için bir try..catch..finally.. bloğu kullanıyoruz. Try bloğunda bağlantı denemesini, catch bloğunda hata ile karşılaşılması durumunda gerçekleştirilecek işlemleri gerçekleştiriyoruz.

    Sub CatchSQLClientException()

        Dim str1 As String = "Data Source=(local);" & _

            "Initial Catalog=northwind;" & _

            "user id = think; password=12345"

        Dim con As SqlConnection = _

            New SqlConnection(str1)

        riskli kodu yazmaya başlıyoruz

        Try

            Bağlantı kurmayı dene

            con.Open()

            bağlantı başarılı olursa debug ekranına

            connectionstringi yadırıyoruz

            Debug.WriteLine(con.ConnectionString)

            Son olarak bağlantıyı kapatıyoruz

            con.Close()

            Kullanıcıya oluşan hataya dair bilgi veriyoruz

        Catch er As System.Data.SqlClient.SqlException

            MsgBox("Bir hata ile karşılaşıldığı için bağlantı" & _

            " oluşturulamadı" & ControlChars.CrLf & er.Message)

        End Try

 

    End Sub


Şekil 2:2 – Oluşturulan hata diyaloğu

 

Bu kodun çalışması sonucunda Northwind veritabanına think adlı kullanıcı hesabı için erişim yetkisi verilmediğinden dolayı bir hata oluşacak ve kullanıcı kullandığımız try catch ifadesi sonucu oluşturulan özelleştirilmiş hata diyaloğunu görecektir.

 

Bir Windows Form uygulamasından bağlantı oluşturulması
Bu bölümde SQL Server’a, kullanıcının seçimine bağlı olarak NT veya SQL Authentication ile bağlantı kuran bir windows uygulaması geliştiriyor olacağız. Aşağıdaki grafikte uygulamamızın tasarım, ve çalışma zamanındaki görüntülerini görebilirsiniz.

 

Şekil 2:3 – Programımızın tasarım ve çalışma zamanı görüntüleri

 

Şu ana kadar yazdığımız kodlar ve açıklamaları ise şu şekilde;

 

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

        varsayılan olarak NT Auth kullanılacak

        Radiobutton1i seçili hale getiriyoruz

        RadioButton1.Checked = True

        SQL Auth için kullanılacak alanları gizliyoruz

        ShowLabelsBoxes(False)

    End Sub

    Private Sub RadioButton1_CheckedChanged _

    (ByVal sender As System.Object, _

    ByVal e As System.EventArgs) _

    Handles RadioButton1.CheckedChanged

        Radiobutton1 seçilirse NT Auth kullanılacak demektir

        dolayısıyla SQL Auth ile ilgili alanları gizliyoruz

        ShowLabelsBoxes(False)

    End Sub

    Private Sub RadioButton2_CheckedChanged _

        (ByVal sender As System.Object, _

        ByVal e As System.EventArgs) _

        Handles RadioButton2.CheckedChanged

        SQL Auth ile ilgili alanları görüntülüyoruz

        ShowLabelsBoxes(True)

    End Sub

    Sub ShowLabelsBoxes(ByVal bolShowEm As Boolean)

        SQL Server Authentication kullanılacağı zaman gerekli

        bilgilerin girileceği metin kutularını ve ilgili labelları

        görüntüleyen veya gizleyen prosedür

        Label2.Visible = bolShowEm

        TextBox2.Visible = bolShowEm

        Label3.Visible = bolShowEm

        TextBox3.Visible = bolShowEm

    End Sub

 

Uygulamamız görsel olarak hazır durumda, şimdi form üzerindeki button (Button1) tıklandığında, yapılan seçime bağlı olarak ConnectionString değeri oluşturulacak ve bir try..catch.. bloğu ile Sql Server bağlantısı oluşturulmaya çalışılacak..

 

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        sqlconnection nesnesi

        Dim con As SqlConnection

        veritabanının adı

        Dim dbName As String = TextBox1.Text

        connectionstring

        Dim CnnStr As String

 

        bağlantı NT Authentication ile gerçekleştirilecekse

        If RadioButton1.Checked = True Then

            NT Authentication için connectionstring

            CnnStr = "Data Source=(local);" & _

            "Initial Catalog=" & dbName & _

            ";Integrated Security=SSPI"

        Else

            SQL Authentication için connectionstring

            kullanıcı adını alıyoruz

            Dim Uid As String = TextBox2.Text

            parolayı alıyoruz

            Dim Pwd As String = TextBox3.Text

            connectionstringi oluşturuyoruz

            CnnStr = "Data Source=(local);" & _

            "Initial Catalog=" & dbName & ";" & _

            "user id=" & Uid & _

            "; password=" & Pwd

        End If

 

        yeni bir sqlconnection nesnesi

        con = New SqlConnection(CnnStr)

 

        Bağlantı oluşturmayı deniyoruz

        Try

            con.Open()

            MsgBox(con.Database & " veritabanına başarıyla bağlantı kuruldu")

            con.Close()

        Catch ex As Exception

            MsgBox("Veritabanına bağlanırken bir sorunla karşılaşıldı")

        End Try

    End Sub

 

Yukarıdaki kod ile birlikte örneğimizi tamamlamış oluyoruz..

 

Bir sonraki bölümde, Command ve DataReader nesneleri ile çalışma konusunu ele alıyor olacağız..

Kadir SÜMERKENT
kadirs@yazgelistir.com