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.

Hiç yorum yok: