SqlClient.SqlBulkCopy Kullanmak

Bu makalemizde SqlClient namespace'indeki SqlBulkCopy classını inceleyeceğiz. SqlBulkCopy mantık oalrak sqlcommand ' a benzemektedir. Uzun data işlemlerinde yüksek performans sağlar. Bir örnek vermek gerekirse; vodafone dan fatura bilgilerinin text olarak bize geldiğini ve bizimde bu bilgiyi VodafoneMembers adlı koleksiyona yüklediğimizi düşünelim.Sonraki aşamada bu kolleksiyon içinde dönüp her kayıt için sqlcommand la içeri aldığmızı varsayalım. Bu işlem için database'de aşırı yük oluşturduğu için sonlanması çok uzun sürecektir.


4016 Dim cmd As New SqlCommand("INSERT INTO Invoices (PhoneNumber, NameSurname, Amount)" & _
4017 "VALUES (@PhoneNumber, @NameSurname, @Amount)", SqlCnn)
4018 Dim XPPhoneNumber As SqlParameter = cmd.Parameters.Add("@PhoneNumber", SqlDbType.NVarChar)
4019 Dim XPNameSurname As SqlParameter = cmd.Parameters.Add("@NameSurname", SqlDbType.NVarChar)
4020 Dim XPAmount As SqlParameter = cmd.Parameters.Add("@Amount", SqlDbType.Decimal)
4021 For Each V As VodafoneMember In _VodafoneMembers
4022 XPPhoneNumber.Value = V.PhoneNumber
4023 XPNameSurname.Value = V.Description
4024 XPAmount.Value = V.Amount
4025 Try
4026 If SqlCnn.State = ConnectionState.Closed Then
4027 SqlCnn.Open()
4028 End If
4029
4030 cmd.ExecuteNonQuery()
4031 Catch ex As Exception
4032 Finally
4033 If SqlCnn.State = ConnectionState.Open Then
4034 SqlCnn.Close()
4035 End If
4036
4037 End Try
4038 Next



Bu işlem için diğer yöntem ise bunu sqlbulkcopy class'ı ile veritabanına almaktır.Bu şekilde veritabanından sqlcommand a göre çok yüksek performanslar alabiliriz. Aşağıdaki örnekte yeni bir datatable oluşturarak bunu sqlbulkcopy classına yükledik. SqlBulkCopy Classının ConnectionTimeOut özelliği programımızın işlemden beklenen geri dönüş süresidir. Bunu 0 getirmek işlem bitene kadar programızın bekleyeceğini belirtmektedir. Çok büyük dataların veritabanına alınırken bu özelliğin 0 (infinity) alınması tavsiye edilmektedir.



4061 Dim DtT As New DataTable("Invoices")
4062 DtT.Columns.Add(New DataColumn("PhoneNumber"))
4063 DtT.Columns.Add(New DataColumn("NameSurname"))
4064 DtT.Columns.Add(New DataColumn("Amount"))
4065 Dim O() As Object
4066 For Each V As VodafoneMember In _VodafoneMembers
4067 ReDim O(2)
4068 O(0) = V.PhoneNumber
4069 O(1) = V.NameSurname
4070 O(2) = V.Amount
4071 DtT.Rows.Add(O)
4072 Next
4073 Using bulkCopy As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(SqlCnn)
4074 If SqlCnn.State = ConnectionState.Closed Then
4075 SqlCnn.Open()
4076 End If
4077 bulkCopy.DestinationTableName = "dbo.Invoices"
4078 bulkCopy.BulkCopyTimeout = 0
4079 Try
4080 bulkCopy.WriteToServer(DtT)
4081 Catch ex As Exception
4082 MsgBox(ex.Message)
4083 Exit Sub
4084 Finally
4085 If SqlCnn.State = ConnectionState.Open Then
4086 SqlCnn.Close()
4087 End If
4088 End Try
4089 End Using
SqlBulkCopy class ını çok büyük bilgi aktarımlarında kullanmak daha yüksek performans almamızı sağlar. Basit bilgi aktarımlarında sqlcommand kullanılması tavsiye edilmektedir.

Kadere İnanmak

Dün gece hiç uykum yoktu. Yatağıma uzandım ve düşünmeye başladım. Neredeyim ne yapıyorum. Nasıl geçti bu kadar zaman. Daha dün gibi hatırlıyorum ÖSS sınav sonuçlarını elime aldığım zamanı. Sonuçtan çokta ümitli değildimı. Yakın arkadaşlarımdan birinin tavsiyesi üzerine Kıbrıs Yakın Doğu Üniversitesi’ne İstanbul’daki ofislerinden kayıt oldum.Kıbrıs 'a gelip Doğu Akdeniz Üniversitesi ’ ni gördüğümde İstanbul’dan üniversiteye kayıt olduğuma pişman oldum. Üniversitede bir arkadaşla tanışmam ve onun aracılığıyla Kaner Holding’e girmem benim için dönüm noktası oldu. Sonra tam İstanbul’ a dönmek için niyetlenmişken İktisatbank ‘ a girmem ve bugünlere gelmem ,hepsini düşündüğümde gerçekten kader inancımı daha da kuvvetlendiriyor. Belki DAÜ ‘ ye gitsem İstanbul ‘ a dönüp farklı yollarda koşturacaktım :).


İnsanların aslında yaptığı tüm seçimler geleceğini etkileyebiliyor. İnsan başına kötü bir olay geldiğinde asla hayata küsmemeli ve aksine daha da fazla asılmalı. Her karanlık gecenin sonu sabahtır. Her insanın kader çizgisi var ve “Herşeyin hayırlısı Allah’tan” diyerek uyku moduna geçiyorum.

WPF Toolkit June 2009 Release

Microsoft 'un Açık kaynak kodlu projelerin bulunduğu Codeplex WPF ve Silverlight için yeni toolkit 'ini yayınladı.Buradan indirebilirisiniz
  • Toolkit'te
  • DataGrid
  • DatePicker
  • Calendar
  • VisualStateManager

yanısıra Chart kontrolu de eklendi. İleri ki günlerde bununla ilgil küçük bir örnek proje yayınlayacağım. Microsoft .NET Framework 3.5 Service Pack 1 + VS2008 makinanızda yüklü olması gerkiyor.

İyi çalışmalar

Blogdaki Kodları Visual Studio'daki Gibi Gösterme (CopySourceAsHtml)

Blogtaki yayınlanacak kodlar için visual studiodaki görüntüyü nasıl elde ederim diye internette şöyle bir arama yaptırdım. Kullanımı gayet basit kullanışlı bir ücretsiz tool buldum ve sizlerle paylaşmak istedim. VS 2003, VS 2005 ve VS 2008 versiyonu bulunan tool kurulumdan sonra seçtiğiniz kod kısmınını üzerinde mouse ' un sağ butonuna basıyorsunuz. Seçeneklerden Copy As Html'i seçiyorsunuz. İstediğiniz yere yapıtıryorsunuz. İşte bu kadar basit ;))


İyi günler iyi çalışmalar.

VB.net İle XML Okuma ve Yazma 3

Bu makalemizde projemizin son kısmını tamamlayacağız. Koleksiyonumuza yeni kayıt ekleme, silme değiştirme ve form kapanırken koleksiyonumuzu xml şeklinde sabit diskimize yazdıracağız

Yeni Kayıt Ekleme:

Burda dikkat edeceğimiz en önemli nokta, kolleksiyonumuz ordered dictionary (benzersiz anahtar, object) olarak objeleri tuttuğu için müşteri numaramız bizim benzersiz anahtarımız olacaktır. Bunu kodla da edeceğiz.





48 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click

49

50 If _AddMode Then

51 If txtCustomerNumber.Text.Trim = vbNullString Then

52 MsgBox("Müşteri numarası boş geçilemez", MsgBoxStyle.Critical, Me.Text)

53 txtCustomerNumber.Focus()

54 Exit Sub

55 End If

56 If Not IsNumeric(txtCustomerNumber.Text.Trim) Then

57 MsgBox("Müşteri numarası numerik bir değer olmalıdır.", MsgBoxStyle.Critical, Me.Text)

58 txtCustomerNumber.Focus()

59 Exit Sub

60 End If

61 Dim C As Customer = _Customers(CInt(txtCustomerNumber.Text.Trim).ToString)

62 If C IsNot Nothing Then

63 MsgBox("Bu müşteri numarası sistemde bulunmaktadır." & vbCrLf & "Lütfen müşteri no yu değiştiriniz.", MsgBoxStyle.Critical, Me.Text)

64 txtCustomerNumber.Focus()

65 Exit Sub

66 End If

67 If txtName.Text.Trim = vbNullString Then

68 MsgBox("Müşteri adı boş geçilemez", MsgBoxStyle.Critical, Me.Text)

69 txtName.Focus()

70 Exit Sub

71 End If

72 If txtSurname.Text.Trim = vbNullString Then

73 MsgBox("Müşteri soyadı boş geçilemez", MsgBoxStyle.Critical, Me.Text)

74 txtSurname.Focus()

75 Exit Sub

76 End If

77 With _Customer

78 .Name = txtName.Text.Trim

79 .Surname = txtSurname.Text.Trim

80 .CustomerNumber = Int(txtCustomerNumber.Text.Trim)

81 End With

82 _Customers.Add(_Customer)

83 End Sub

Kayıtları Güncelleme

Bir önceki makalemizdeki listview itemlerinin tag larına yüklediğimiz müşteri numaları ile objemizi oluşturup diğer formumuza objeyi göndereceğiz.

50 #Region " ListView1_MouseDoubleClick"

51 Private Sub ListView1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDoubleClick

52 If e.Button = Windows.Forms.MouseButtons.Left Then

53 If ListView1.SelectedItems.Count > 0 Then

54 Dim frm As New frmDetails

55 frm.Customers = Customers

56 frm.Customer = Customers(ListView1.SelectedItems(0).Tag.ToString)

57 frm.AddMode = False

58 Dim DR As DialogResult = frm.ShowDialog

59 If DR = Windows.Forms.DialogResult.OK Then

60 Customers = frm.Customers

61 FillListview()

62 End If

63

64 End If

65 End If

66

67 End Sub

68 #End Region

Diğer formun load olayında değerleri yükleyeceğiz. Değişiklikleri kaydedeceğiz.

33 #Region " frmLoad"

34 Private Sub frmDetails_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

35 If Not _AddMode Then

36 With _Customer

37 txtCustomerNumber.Text = .CustomerNumber.ToString

38 txtCustomerNumber.Enabled = False

39 txtName.Text = .Name

40 txtSurname.Text = .Surname

41 End With

42 Else

43 _Customer = New Customer

44 End If

45 End Sub

46 #End Region



81 #Region " btnOK"

82 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click

83

84 If Not _AddMode Then

85

86

87 If txtName.Text.Trim = vbNullString Then

88 MsgBox("Müşteri adı boş geçilemez", MsgBoxStyle.Critical, Me.Text)

89 txtName.Focus()

90 Exit Sub

91 End If

92 If txtSurname.Text.Trim = vbNullString Then

93 MsgBox("Müşteri soyadı boş geçilemez", MsgBoxStyle.Critical, Me.Text)

94 txtSurname.Focus()

95 Exit Sub

96 End If

97

98 With _Customers(_Customer.CustomerNumber.ToString)

99 .Name = txtName.Text.Trim

100 .Surname = txtSurname.Text.Trim

101 End With

102 End If

103 Me.DialogResult = Windows.Forms.DialogResult.OK

104 Me.Close()

105 End Sub

106 #End Region



Silme İşlemi

Listview deki itemleri seçtiğimiz an Sil butonu aktif hale getirip, koleksiyondan sileceğiz




69 #Region " btnDelete"

70 Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click

71 If ListView1.SelectedItems.Count > 0 Then

72 Dim MSDR As MsgBoxResult = MsgBox(" Bu müşteriyi silmek istediğinizden emin misiniz", MsgBoxStyle.YesNo, Me.Text)

73 If MSDR = MsgBoxResult.Yes Then

74 Customers.Remove(ListView1.SelectedItems(0).Tag.ToString)

75 FillListview()

76 End If

77 Else

78 MsgBox("Lütfen silmek istediğiniz müşteriyi seçiniz", MsgBoxStyle.Critical, Me.Text)

79 Exit Sub

80 End If

81 End Sub

82 #End Region

XML'i sabit diske yazma

Form kapanırken XML 'i sabit diskte saklayacağız.


17 Private Sub frmList_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

18 Dim XW As New Xml.XmlTextWriter("C:\C\Customers.Xml", System.Text.Encoding.Default)

19 XW.Formatting = Xml.Formatting.Indented

20 Customers.WriteXML(XW)

21 End Sub

Projeyi buradan indirebilirsiniz

VB.net İle XML Okuma ve Yazma 2

Makalemizin ikinci bölümünde en kritik noktalardan biri olan objelerimiz ve objelerimizi bir arada tutan collectionlar kavramını işleyeceğiz.. XML yazma ve okuma fonksiyon olarak kolleksiyonumuzda olacak. Kolleksiyonumuz Ordered Dictionary şeklinde class larımızı tutacağız. 

Objel(Class)  ve Kolleksiyon
Objelerimizde Müşteri Id (Tekil alan), Name, Surname şeklinde olacaktır


    1 #Region " Customer"

    2 Public Class Customer

    3 #Region " Declarations"

    4     Private _CustomerNumber As Integer

    5     Private _Name As String

    6     Private _Surname As String

    7 #End Region

    8 #Region " Properties"

    9     Public Property CustomerNumber() As Integer

   10         Get

   11             Return _CustomerNumber

   12         End Get

   13         Set(ByVal value As Integer)

   14             _CustomerNumber = value

   15         End Set

   16     End Property

   17     Public Property Name() As String

   18         Get

   19             Return _Name

   20         End Get

   21         Set(ByVal value As String)

   22             _Name = value

   23         End Set

   24     End Property

   25     Public Property Surname() As String

   26         Get

   27             Return _Surname

   28         End Get

   29         Set(ByVal value As String)

   30             _Surname = value

   31         End Set

   32     End Property

   33 #End Region

   34 End Class

   35 #End Region

   36 #Region " Customers"

   37 Public Class Customers

   38     Implements IEnumerable, IEnumerator

   39     Dim List As System.Collections.Specialized.OrderedDictionary

   40     Dim Position As Integer = -1

   41     Public Sub New()

   42         List = New System.Collections.Specialized.OrderedDictionary

   43 

   44     End Sub

   45     Public Sub Add(ByVal Value As Customer)

   46         List.Add(Value.CustomerNumber.ToString, Value)

   47     End Sub

   48     Default Public ReadOnly Property Item(ByVal Index As Integer) As Customer

   49         Get

   50             Return CType(List(Index), Customer)

   51         End Get

   52     End Property

   53     Default Public ReadOnly Property Item(ByVal Key As String) As Customer

   54         Get

   55             Return CType(List(Key), Customer)

   56         End Get

   57     End Property

   58     Public Sub Remove(ByVal Key As String)

   59         List.Remove(Key)

   60     End Sub

   61     Public Sub Remove(ByVal Index As Integer)

   62         List.RemoveAt(Index)

   63     End Sub

   64     Public ReadOnly Property Count() As Integer

   65         Get

   66             Return List.Count

   67         End Get

   68     End Property

   69     Public Sub Clear()

   70         List.Clear()

   71     End Sub

   72     Public ReadOnly Property Current() As Object Implements System.Collections.IEnumerator.Current

   73         Get

   74             Return CType(List(Position), Customer)

   75         End Get

   76     End Property

   77     Public Function MoveNext() As Boolean Implements System.Collections.IEnumerator.MoveNext

   78         Position += 1

   79         Return Position < List.Count

   80     End Function

   81     Public Sub Reset() Implements System.Collections.IEnumerator.Reset

   82         Position = -1

   83     End Sub

   84     Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator

   85         Position = -1

   86         Return CType(Me, IEnumerator)

   87     End Function

   88     Public Sub WriteXML(ByVal XW As Xml.XmlWriter)

   89         XW.WriteStartDocument()

   90         XW.WriteStartElement("Customers")

   91         For Each C As Customer In Me

   92             XW.WriteStartElement("Customer")

   93             XW.WriteAttributeString("CustomerNumber", C.CustomerNumber.ToString)

   94             XW.WriteAttributeString("Name", C.Name)

   95             XW.WriteAttributeString("Surname", C.Surname)

   96             XW.WriteEndElement()

   97         Next

   98         XW.WriteEndElement()

   99         XW.WriteEndDocument()

  100         XW.Flush()

  101         XW.Close()

  102     End Sub

  103     Public Sub ReadXML(ByVal XR As Xml.XmlReader)

  104         Me.Clear()

  105         While XR.Read

  106             Select Case XR.NodeType

  107                 Case Xml.XmlNodeType.Element

  108                     Select Case XR.Name

  109                         Case "Customer"

  110                             Dim C As New Customer

  111                             While XR.MoveToNextAttribute

  112                                 With C

  113                                     Select Case XR.Name

  114                                         Case "CustomerNumber"

  115                                             .CustomerNumber = CInt(XR.Value)

  116                                         Case "Name"

  117                                             .Name = XR.Value

  118                                         Case "Surname"

  119                                             .Surname = XR.Value

  120                                     End Select

  121                                 End With

  122                             End While

  123                             Me.Add(C)

  124                     End Select

  125             End Select

  126         End While

  127         XR.Close()

  128     End Sub

  129 End Class

  130 #End Region

 İlk formumuzda bir önceki makalemizde yaptığmız listview’I kullanacağız.Form Load olayında Read XML ile bilgilieri kolleksiyona alıp listview I dolduracağız. Listview öğelerinin taglarına müşterilerin numaralarını atayacağız.



    2 #Region " Declarations"

    3     Dim Customers As New Customers

    4 #End Region

    5 #Region " frmEvents"

    6     Private Sub frmList_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    7         If IO.Directory.Exists("C:\C") Then

    8             If IO.File.Exists("C:\C\Customers.Xml") Then

    9                 Customers.ReadXML(New Xml.XmlTextReader("C:\C\Customers.Xml"))

   10             End If

   11         Else

   12             IO.Directory.CreateDirectory("C:\C")

   13         End If

   14 

   15         FillListview()

   16     End Sub

   17     Private Sub frmList_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

   18         Dim XW As New Xml.XmlTextWriter("C:\C\Customers.Xml", System.Text.Encoding.Default)

   19         XW.Formatting = Xml.Formatting.Indented

   20         Customers.WriteXML(XW)

   21     End Sub

   22 #End Region

   23 #Region " PrivateMethods"

   24     Public Sub FillListview()

   25         ListView1.Items.Clear()

   26         If Customers.Count > 0 Then

   27             For Each C As Customer In Customers

   28                 Dim Li As ListViewItem = ListView1.Items.Add(C.CustomerNumber.ToString)

   29                 Li.SubItems.Add(C.Name)

   30                 Li.SubItems.Add(C.Surname)

   31                 Li.Tag = C.CustomerNumber

   32             Next

   33         End If

   34 

   35     End Sub

   36 #End Region







Devamı bir sonraki makalemizde