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