Visual Studio 2008 arayüzü ile JavaScript kodlaması yaparken kod tamamlamalarındaIntellisense boşlukspace tuşuna alışık bir yazılımcıysanız Visual Studio 2010 sinirlerinizi çok bozabilir. Sadece Enter ve Tab tuşlarını dikkate alıyor.
Çözüm; Tools -> Options -> Text Editor -> JScript -> Miscellaneous altında Only use Tab or Enter to commit seçeneğini kaldırmanız yeterli olacaktır.
Excel yada benzeri bir kaynaktan elde ettiğimiz yaklaşık bir milyon kayıt içeren bir DataTable olduğunu düşünelim. Bu kayıtları veritabanında ki x bir tabloya nasıl eklerizinsert?
Tek tek Insert yapmak mı? Bildiğin intihar olur. DataAdapter ile UpdateGüncelleme yapmak mı? İnanılmaz zahmetli ve gereksiz.(Çalışacağından emin bile değilim)
Biri Bulk Insert mü dedi, işte aradığımız cevap. Bulk Insert, yüklü miktarda ki verileri herhangi bir tablotableya performanslı bir şekilde eklemek için veri katmanında kullanabileceğimiz bir komuttur. Ado.Net teknolojisi SqlBulkCopy (kısaca sbc diyelim) nesnesi ile bu komutu kolaylıkla kullanmamıza olanak verir. Tabi kullanımı bu kadar kısıtlamamak gerekir. Sbc ile iki farklı sunucu yada aynı sunucu içinde iki farklı tablo da kopyalanabilir.
Bir örnek ile açıklayalım; Excel dosyasındaki verileri DataTable nesnesine dolduracağız. Peşinde sbc ile DataTable içindeki verileri örnek bir tabloya ekleyeceğiz.
Örnek Excel dosyası
Hedef tablo
Excel dosyasındaki alanlar ile tablo alanfieldlarını bilerek farklı isimlendirdim. Sbc nesnesinin bir özelliği de bu gibi durumlarda alanları adresleyebilmesidirmapping.
//Excel -> DataTable string SourceConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\data.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"; DataTable SourceDT = null; using (OleDbConnection SourceConn = new OleDbConnection(SourceConnStr)) { using (OleDbDataAdapter SourceDAP = new OleDbDataAdapter( "select * from [Contact]", SourceConn)) { SourceDT = new DataTable("Contact"); SourceDAP.Fill(SourceDT); } } //DataTable -> Sql using (SqlConnection DestinationConn = new SqlConnection( "Data Source=.;Initial Catalog=Ordek;Integrated Security=True")) { DestinationConn.Open(); using (SqlBulkCopy SBC = new SqlBulkCopy(DestinationConn)) { //Verilerin kopyalanacağı Tablo Adı SBC.DestinationTableName = "Kisiler"; //Kaynak ile hedef alanlarının adları farklı ise //alanları adreslemek gerekir SBC.ColumnMappings.Add("ContactID", "ID"); SBC.ColumnMappings.Add("FirstName", "Ad"); SBC.ColumnMappings.Add("LastName", "Soyad"); SBC.ColumnMappings.Add("EmailAddress", "Email"); SBC.ColumnMappings.Add("Phone", "Telefon"); //son olarak WriteToServer metotu ile kaynak hedefe kopyalanır SBC.WriteToServer(SourceDT); //DataTable dışında DataRow koleksiyonu yada DataReader nesnesi de //parametre olarak verilebilir. } }
Örnek proje.
Herhangi bir text (cs,sql gibi) ortamında çalışırken Ctrl+U klavye kısayolunu ile seçili tüm karakterleri küçük harfe çevirebilirsiniz.
Güncelleme: Ctrl + Sfth + U ile de büyük harfe çevirebilirsiniz.
Guid değer elde etmenin bir çok yolu mevcut. Powershell kullanarak elde etmekte bunlardan bir tanesi.
Metotlar geriye değer döndürür yada döndürmez. Peki döndürenler kaç değer döndürür denildiğinde tabi ki bir deriz. Birden fazlaya ihtiyaç varsa ne yaparız? Bunun için 3 metot prototipi yazdım, paylaşıyorum.
class Program { static void Main(string[] args) { //1. yöntemin kullanımı int a, b; a = Yontem1(out b); // sonuc //a -> 20 ve b -> 10 olur. } //1. yöntem -> out kullanımı static int Yontem1(out int par) { par = 10; return 20; }
İlk yöntem out parametre anahtarını kullanmak. Geriye dönmediği kesin ama metottan etkilendiğide bir gerçek. İşe yarıyor mu, evet :)
class Program { static void Main(string[] args) { //2. yöntemin kullanımı DonenTip tip = Yontem2(); //sonuc //tip.a -> 20 ve tip.b -> 10 olur. } //2. yöntem -> sınıf(class) kullanmak class DonenTip { public int a, b; } static DonenTip Yontem2() { DonenTip tip = new DonenTip(); tip.a = 20; tip.b = 10; return tip; }
İkinci yöntem ise Classnesne (Custom Reference Type) kullanmak. Geriye yine tek bir nesne dönüyor. İçsel olarak genişletilebilmesi (property, field) sayesinde çok kullanışlı lakin yazması zahmetli.
class Program { static void Main(string[] args) { //3. yöntemin kullanımı var sonuc = Yontem3(); //sonuc.Item1 -> 20 ve sonuc.Item2 -> 10 olur. } //3. yöntem Tuples kullanımı static Tuple<int, int> Yontem3() { return Tuple.Create(20, 10); }
Son yöntem aslında yazının amacı ve Framework 4.0 yeniliği olan Tupleçok-ögeli kullanmak...