30 Kasım 2012 Cuma

BATCH INSERT, (SQL ve C# ile)


Birden fazla kayıt insert veya update edilecekse çoğunlukla bunu bir döngü ile yaparız. Fakat kayıt sayısı eğer çok fazla ise, örneğin 10 bin kaydın insert ve update’i gerekiyorsa o zaman bu performans anlamında büyük bir sıkıntı oluşturmakta. Fakat batch insert kullanılarak bu performans sorunu ortadan kaldırıabilir. Bir projede gerek duyduğumuz bir durum için adım adım aşağıdaki gibi sorunu çözdük.

1-   Batch insert’ü gerçekleştirecegimiz tablo aşağıdaki gibi üç alana sahip bir tablo.


2-   Tablomuz ile veri tipine ait bir tablo tipi tanımlıyoruz. (user-define table types sekmesinde tüm tanımlı tablo tipleri görülebilir. )


3-   Yukarıda tanımladığımız tablo tipini parametre olarak kabul eden sp’mizi de aşağıdaki gibi şekillendiriyoruz.


 Tablo, store procedure ve type'ı aşağıdaki gibi oluştu.



Buna kaşılık UI'dan örnek olarak 10000 kayıtlı bir liste gönderelim. Bunun için aşağıdaki kodu kullanabiliriz.
Bir console application açarak aşağıdaki gibi kodlayabiliriz.

class Program    {
        static void Main(string[] args)
        {
            List<IncomingFile> inFileList = new List<IncomingFile>();
 
            for (int i = 0; i < 10000; i++)
            {
                IncomingFile inFile = new IncomingFile();
                inFile.FileName = String.Format("{0}.File", i.ToString());
                inFile.Password = String.Format("{0}", i.ToString());
                inFile.BusinessDate = DateTime.Now;
                inFileList.Add(inFile);
            }
            IncomingFile.InsertAll(inFileList);
 
        }
    }
 
    class IncomingFile    {
        public string FileName { getset; }
        public string Password { getset; }
        public DateTime BusinessDate { getset; }
 
        public static void InsertAll(List<IncomingFile> contractList)
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "server=BTUGUNSALNB\\UNSAL;database=BLOG;Trusted_Connection=true";
            
 
            SqlCommand command = new SqlCommand();
	   //Çalıştıracağımız command'in Store Procedure olduğunu belirtiyoruz. 
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "ART.ins_InComingFileBatch";
            command.Connection = con;
 
            var dtContractList = GenerateIncomingFileListTable(contractList);
            // Parameters            
            SqlParameter parameter = new SqlParameter();
            parameter.ParameterName = "IncomingFileList";
            parameter.SqlDbType = SqlDbType.Structured;
            parameter.TypeName = "ART.TypeIncomingFileList";
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = dtContractList;
            command.Parameters.Add(parameter);
 
            if (con.State != ConnectionState.Open)
                con.Open();
            try            {
               int result =  command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }
        
        private static DataTable GenerateIncomingFileListTable(List<IncomingFile> IncomingFileList)
        {
            DataTable valueTable = new DataTable();
            valueTable.Columns.Add("FileName"typeof(string));
            valueTable.Columns.Add("Password"typeof(string));
            valueTable.Columns.Add("BussinessDate"typeof(DateTime));
 
            if (IncomingFileList != null)
            {
                foreach (var item in IncomingFileList)
                {
                    DataRow dr = valueTable.NewRow();
                    dr["FileName"] = item.FileName;
                    dr["Password"] = item.Password;
                    dr["BussinessDate"] = item.BusinessDate;
                    valueTable.Rows.Add(dr);
                }
            }
            return valueTable;
        }
    }
 
Sonuc olarak, tek bir transaction ile 10000 kaydı database' göndererek insert ediyoruz.

28 Kasım 2012 Çarşamba

Visual Studio'da Çoklu Solution Template hazırlamak / Creating Mutliple Project Solution Template in Visual Studio

Visual Studio da proje template'i oluşturup benzer projeler üretirken zaman tasarrufu sağlayabilirsiniz.
Aynı zamanda kurumsal firmalar için bu bir standart sağlama yöntemi de olabilir. Bunun ile alakalı olarak faydalı bir link;  http://msdn.microsoft.com/en-us/vstudio/cc315061.aspx

Kendimce bir örnekle izah etmeye çalışacağım.

1-Önce template'ini çıkaracağımız solution'ı oluşturuyoruz.
   [First you should create the solution for your template.]


2-File menusunden Export Template ile solutiondaki her dosyanın template'ini oluşturuyoruz.(bir wizard yardımı ile) 
[We use Export Template action in File menu for each project in the solution.]



3-Bunun için, wizard bizi yönlendiriyor zaten.
[For this, wizard already leads us to do this.]
 4-Hangi projenin template'ni alacağımızı ve açıklamasını yazıyoruz.
[We declare template description and name, also we can choose an icon and preview image]
 5-My Exported klasörüne zip'li bir halde kayediyor.
[This creates a zip file to My Exported folder which is in C:\Users\yourUser\Documents\Visual Studio 2010\My Exported Templates]
 6-Bunu projedeki tüm projeler için tekrarlayın.
[Repeat this process for all project in the solution.]
 7-Bu zip'leri teker teker açın. (zipli dosyaları silebilirsiniz.)
[Open each zip files. (You can delete all zip files.]
 8-Ve zurnanın zırt dediği yer... bir tane .vstemplate uzantılı bir xml hazırlayacağız.
[here is make-or-break issue, create an xml file which has extension .vstemplate ]


9-Oluşan zip dosyasını MySolutionTemplate.vstemplate olarak klasörlerimizin olduğu yere kopyalıyoruz.
[This zip file as MySolutionTemplate.vstemplate should be in the same place with templated project folders; BusinessLogic, DataBaseAcces etc. ]

10-Sonra oluşan bu 5 nesneyi aşağıda görüldüğü gibi zipliyoruz.
[And then zip all folders and files... ]
 11-Zipli dosyayı My Exported Templates klasöründen keserek,
 [Cut that file from My Exported Templates to Templates\ProjectTemplates folder]
 12-Templates\ProjectTemplates klasörüne yapıştırıyoruz.
 [Cut that file from My Exported Templates to Templates\ProjectTemplates folder ]


 13-Sonrasında eklediğimiz template'i seçerek OK'lediğimizde Solution Explorerda aşağıdaki gibi Solution'ımız oluşuyor. Artık istediğimiz kadar kullanabiliriz.
[Finally as creating new project, we see our template and can use at any time. ]
 14-Ve mutlu son. En azından benim için öyle oldu.
[here is the happy end. at least for me :)]