Caner Tosuner

Leave your code better than you found it

Store Procedure if / else Kullanımı

Store Procedure'ler veri tabanı kullanılan projelerin olmazsa olmazıdır.Bunun en önemli nedeni Güvenlik ve Hız dır. Ado.net kullanılanılarak veri insert, update, delete işlemleri yapılan bir uygulamada Store Procedure değilde direkt olarak SqlCommand nesnesine "insert,update,delete" gibi query'ler yazmak pek önerilen bir yol değildir. Nedeni de yine az önce söylediğim gibi öncelikle hız, güvenliktir ve yazdığın kodun ne kadar profesyonelce yazıldığıyla ilişkilidir.

Store Procedure'lerde IF ELSE kullanabildiğiniz vakit emin olun uygulama tarafında yazdığınız C# kodları %30'lara kadar azalacaktır. Örnek olarak verecek olursak; database'de kayıtlı Users adında bir tablom var ve bu tablo Ad, Soyad, Email bilgilerini alarak kullanıcıları kaydediyor olsun. Store Procedure kullanarak bu kullanıcıları database'e kaydeden bir uygulama geliştirecek olduğumuzda, UserInsert ve  UserUpdate işlemlerini yapan 2 adet Store Procedure ihtiyacımız var diyelim. Aslında IF ELSE kullanarak bunu bir Store Procedure ile yapmak hem daha hızlı, hemde C# tarafında bizi çok daha fazla kod yazmaktan kurtarıyor.

Users Tablosu Örneği;

CREATE PROCEDURE InsertUser   //Procedure İsmi

    @Ad varchar(20),   //aldığı atribüt'ler

    @Soyad varchar(20),

    @Email varchar(20)

AS

BEGIN

      DECLARE@HasExist int  //Email adresine göre o kullanıcı daha önce kayıt olmuş mu diye kontol etmemizi sağlayacak olan değişken

      Select @HasExist COUNT(1)

      from Users

      Where Email=@Email   //Bu email adresi kayıtlı mı diye bakıyoruz

IF(@HasExist=0) //Üstteki sorgudan dönen değer @HsExist değişkenine atanıyor ve eğer o kayıt var ise "0" dan farklı bir değer yok ise "0" değerini dönüyor, "0" döndüğünde yeni bir kayıt ekleyeceğimizi anlıyoruz ve aşağıda olduğu gibi Procedure'e parametre olarak gelen değerleri alıp tabloya yeni bir User ekliyoruz

BEGIN

      Insert Into Users   //Insert işlemi

      values

            (@Ad,@Soyad,@Email)

END

ELSE  //Eğer @HasExist "0" a eşit değilse bu demek oluyorki bu kullanıcı database'de kayıtlı bulunmakta, bu seferde Procedure'e parametre olarak gelen değerleri alarak o kullanıcının bilgilerini aşağıda olduğu gibi Update ediyoruz

BEGIN

      Update Users   //Update işlemi

      set

            Ad =@ Ad,  //bilgileri update ediyoruz

            Soyad=@Soyad,

            Email=@Email

      WHERE Email=@Email  //where koşulu O kullanıcıyı bulmamızı sağlıyor

END

END

 

 

"Xap packaging failed. Object reference not set to an instance of an object" Hatası

Windows Phone uygulamalarında "Xap packaging failed. Object reference not set to an instance of an object." hatası aldığınızda sorunun nedeni büyük olasılıkla uygulama içerisinde daha önceden var olan bir resim dosyası yada o tür bir dosyanın silinmiş olmasıdır.

 

 

 

Örnek olarak sol tarafta resimde olduğu gibi banner.png dosyası bulunduğu klasörden silinmiş ancak solution'da halen bulunmaktadır. Çözüm; bu dosyayı solution içerisinden de silmektir.

 

 

Windows Phone Bing Map Kullanımı

Windows Phone Bing Map Kullanımı        

Windows Phone’da içerisinde harita kullanımını gerektiren bir uygulama geliştirmek istediğinizde Bing Map Apı lerinden kolaylıkla yararlanabilirsiniz. Öncelikle ilk yapmanız gereken geliştireceğiniz uygulama için Bing Map Key almanız. Bunun için ilk olarak

 https://www.bingmapsportal.com/ sitesine giderek var olan Microsoft hesabı yada yeni hesap oluşturarak giriş yapmalısınız

sonrasında sol tarafta bulunan menüden Create or view keys ‘e tıklayıp


Gerekli yerleri doldurduktan sonra create key butonuna tıklıyoruz.


Uygulama için bir adet Key oluşuturyoruz ve bu Key’i sonrasında uygulama içerisinde Map kontrolünün içerisine atıyoruz.


Windows Phone uygulamamızın Design sayfasına bir adet Map Kontrolü atıyoruz ve CredentialsProvideriçerisine oluşturmuş olduğumuz Key’i yazıyoruz.

  <Maps:Map Name="mymap" CredentialsProvider="BinMapKey" Width="480" Height="300" VerticalAlignment="Bottom"/>

 

 

Gerekli işlemleri yaptıktan sonra uygulamamızı çalıştırıyoruz ve daha önceleri geliştirmiş olduğumda Son Depremler uygulamasında ki BingMap’in ekran görüntüsü aşağıda olduğu gibidir.

 

Windows Phone SmsComposeTask Kullanımı (Uygulama'dan SMS yollama)

Windows Phone'da uygulama içerisinden SMS göndermek istediğinizde SmsComposeTask kontrolünü kullanabilirsiniz. Daha öncesinde geliştirmiş olduğum Kandil,Bayram SMS uygulamasında da kullandığım kodlar aşağıda mevcuttur.

            SmsComposeTask myTask= new SmsComposeTask();
            myTask.To = " ";  //Sms'in gönderileceği numara
            myTask.Body  ="Message";  //Sms'in içeriği
            myTask.Show();         //Task'i çalıştırdığımız yer

 

 

 

Northwind Database Örnek Soru Cevapları

Northwind Database Örnek SQL Sorgu ve Cevapları

1-)Tüm cirom ne kadar?

SELECT SUM((UnitPrice*Quantity)-(UnitPrice*Quantity*Discount))

ROM[Order Details]

2-)Bugün doğumgünü olan çalışanlarım kimler?

select *

from employees

where month(BirthDate)=month(getdate()) and day(BirthDate)=day(getdate())

3-)Hangi çalışanım hangi çalışanıma bağlı? (İsim - İsim)

select e.FirstName +e.LastName,em.FirstName +em.LastName

from Employees e

inner join Employees em

on e.EmployeeID=em.EmployeeID

4-)Çalışanlarım ne kadarlık satış yapmışlar? (Gelir bazında)

select e.FirstName + ' ' + e.LastName, SUM(Quantity*UnitPrice)

from Employees e

inner join Orders o

on e.EmployeeID=o.EmployeeID

inner join [Order Details] od

on o.OrderID=od.OrderID

group by e.FirstName,e.LastName

5-)Hangi ülkelere ihracat yapıyorum?

select distinct country

from customers

6-)Ürünlere göre satışım nasıl? (Ürün-Adet-Gelir)

select p.ProductName,SUM(od.Quantity) as Adet,sum(od.Quantity*od.UnitPrice*(1-od.Discount)) as Gelir

from Products p

inner join [Order Details] od

on p.ProductID=od.ProductID

group by p.ProductName

order by 3 desc

7-)Ürün kategorilerine göre satışlarım nasıl? (Gelir bazında)

select c.CategoryName,SUM(od.Quantity*od.UnitPrice) as Gelir

from Categories c

inner join Products p

on c.CategoryID=p.CategoryID

inner join [Order Details] od

on p.ProductID =od.ProductID

group by c.CategoryName

order by 2 desc

8-)Ürün kategorilerine göre satışlarım nasıl? (Adet bazında)

select c.CategoryName,SUM(od.Quantity) as Adet

from Categories c

inner join Products p

on c.CategoryID=p.CategoryID

inner join [Order Details] od

on p.ProductID =od.ProductID

group by c.CategoryName

order by 2 desc

9-)Çalışanlarım ürün bazında ne kadarlık satış yapmışlar? (Çalışan  –  Ürün – Adet – Gelir)

select (e.FirstName + e.LastName) as Çalisanp.ProductNamesum(od.Quantity), SUM(od.Quantity*od.UnitPrice)

from Products p

inner join [Order Details] od

on p.ProductID=od.ProductID

inner join Orders o

on od.OrderID=o.OrderID

inner join Employees e

on o.EmployeeID=e.EmployeeID

group by e.FirstName + e.LastName,p.ProductName

order by 4 desc

10-)Hangi kargo şirketine toplam ne kadar ödeme yapmışım?

select s.CompanyName,SUM(o.Freight) as [Ödenen Ücret]

from Shippers s

inner join Orders o

on s.ShipperID=o.ShipVia

group by s.CompanyName

11-)Tost yapmayı seven çalışanım hangisi? (Basit bir like sorgusu J)

select FirstName + ' ' +LastName

from Employees

where Notes like'%Toast%'

12-)Hangi tedarkçiden aldığım ürünlerden ne kadar satmışım? (Satış bilgisi order details tablosundan alınacak) (Gelir ve adet bazında)

select s.CompanyName,p.ProductName, SUM(od.Quantity) as adet,sum(od.Quantity*od.UnitPrice) as gelir

from Suppliers s

inner join Products p

on s.SupplierID=p.SupplierID

inner join [Order Details] od

on p.ProductID=od.ProductID

group by  s.CompanyName , p.ProductName

order by 3 desc

13-)En değerli müşterim hangisi? (en fazla satış yaptığım müşteri) (Gelir ve adet bazında)

select top 1 c.CompanyName,SUM(od.Quantity) as adet,SUM(OD.Quantity*od.UnitPrice) as gelir

from Customers c

inner join orders o

on c.CustomerID=o.CustomerID

inner join [Order Details] od

on o.OrderID=od.OrderID

group by c.CompanyName

order by 3 desc

14-)Hangi ülkelere ne kadarlık satış yapmışım?

select c.Country,SUM(od.Quantity*od.UnitPrice)

from Customers c

inner join Orders o

on c.CustomerID=o.CustomerID

inner join [Order Details] od

on o.OrderID=od.OrderID

group by c.Country

order by 2 desc

15-)Zamanında teslim edemediğim siparişlerim ID’leri  nelerdir ve kaç gün geç göndermişim?

select OrderID,datediff(DAY,ShippedDate,RequiredDate) as dt

from Orders

where datediff(DAY,ShippedDate,RequiredDate)>0

16-)Ortalama satış miktarının üzerine çıkan satışlarım hangisi?(subquerry kullandık, querrynin içinde querry tanımladık)

select *

from [Order Details] od

where Quantity>(select AVG(Quantity) from [Order Details])

order by od.Quantity desc

17-)Satışlarımı kaç günde teslim etmişim?

select OrderID,datediff(DAY,OrderDate,ShippedDate)

from Orders

where ShippedDate not like 'NULL'

order by 2 desc

 

Yeni Başlat Butonu Göründü Gibi :)

Windows 8'in 8.1 güncellemesi ile birlikte geri geleceği söylenen başlat butonu göründü.

 

Geçtiğimiz yıl kullanıma sunulan Windows 8 kullanıcılar tarafından beğenilse de diğer Windows sürümlerinde alışılan Başlat menüsü Windows 8 de yoktu ve Microsoft'un kullanıcılar tarafından önemli eleştiri oklarına tutulmasına neden olmuştu.Son çıkan haberlere göre ise Microsoft bu eleştirilere bir cevap olarak Haziran ayında çıkarılması tahmin edilen Windows 8.1(Windows Blue) güncellemesi ile birlikte birçok eksiklik ve yeniliklerin yanında Başlat menüsünü de geri getireceği tahmin ediliyor.

 

Sızdırılan görüntüde Windows XP yada Windows 7'de alışık olmadğımız sade ve hoş bir tasarım olduğu dikkat çekiyor.

 

Windows Phone CMS'den Notification Gönderme

Toast Notifications uygulamadaki bir olaya bağlı olarak oluşturulan notification çeşididir. Örneğin RSS’ten veri çeken bir uygulama düşünüldüğünde yeni gelen bir kayıt için kullanıcıya haber vermek isteyebilirsiniz veya uygulamanızda mesajlaşma gibi özellikler varsa yeni mesajın  geldiğini bildirebilirsiniz. Bunların dışında haberler, hava durumu gibi birçok örnek verilebilir.

Senaryo şu şekilde işliyor;

Uygulama işletim sistemine "Bana birisi Toast Notification yollayacak.." diyor ve işletim sistemi sonrasında Microsoft'un Push Notification Server'ına bağlanıyor ve diyor ki "Sana benim uygulamam için bir notification yollanacak nereye yollansın ?" Telefonun işletim sistemi uygulamaya bir Endpoint atıyor ve işletim sistemi diyor ki "Bu endpoint'e Notification gönderilirse ben onu senin adına göstericem".Sonrasında uygulama bu endpoint'i alıp kendi local server'ına "Bu ID'li cihaz için şu endpoint'e mesaj yollarsan görünecektir." diyor ve gönderilen mesaj uygulama ekranında görünüyor.

 

 

  • Aşağıdaki örnek uygulama bir Asp.Net sayfasından Windows Phone uygulamasına nasıl Toast Message gönderilir açıklıyor olacaktır

 

Window Phone Projesi. MainPage.xaml sayfası

 

HttpNotificationChannel Channel;  //Global değişkenimiz

public MainPage()

{

InitializeComponent();

 

Channel = HttpNotificationChannel.Find("Find"); //Kayıtlı kanal var mı kontrolünün yapıldığı yer

if (Channel == null)

{

Channel = newHttpNotificationChannel("Kanal");

 

//Kullanacağımız eventleri oluşturuyoruz

Channel.ChannelUriUpdated += Channel_ChannelUriUpdated;

 

Channel.ShellToastNotificationReceived +=

Channel_ShellToastNotificationReceived;

 

Channel.Open();

Channel.BindToShellToast();

}

}

void Channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)

{

StringBuilder message = newStringBuilder();

string relativeUri = string.Empty;

 

message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());

 

 

foreach (string key in e.Collection.Keys)

{

message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);

 

if(string.Compare(key,"wp:Param",System.Globalization.CultureInfo.InvariantCulture,

System.Globalization.CompareOptions.IgnoreCase) == 0)

{

relativeUri = e.Collection[key];

}

}

 

// Toast mesajı için ekranda dialog çıkartır

Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));

}

 

 

 

void Channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)

{

Dispatcher.BeginInvoke(() =>

{

System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());

MessageBox.Show(String.Format("Channel Uri is {0}",

e.ChannelUri.ToString()));

 

});

 

}

 

 

Toast mesajının gönderileceği Asp.Net Projesi

Gonder.aspx Design sayfası

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headid="Head1"runat="server">

    <title></title>

</head>

<body>

    <formid="form1"runat="server">

        <div>

 

            <br/>

            Enter URI:

        </div>

        <asp:TextBoxID="TextBoxUri"runat="server"Width="666px"></asp:TextBox>

        <br/>

        <br/>

        Enter Title:<br/>

        <asp:TextBoxID="TextBoxTitle"runat="server"></asp:TextBox>

        <br/>

        <br/>

        Enter Subtitle:<br/>

        <asp:TextBoxID="TextBoxSubTitle"runat="server"></asp:TextBox>

        <br/>

        <br/>

        <br/>

        <asp:ButtonID="ButtonSendToast"runat="server"OnClick="ButtonSendToast_Click"

            Text="Send Toast Notification"/>

        <br/>

        <br/>

        Response:<br/>

        <asp:TextBoxID="TextBoxResponse"runat="server"Height="78px"Width="199px"></asp:TextBox>

    </form>

</body>

 

</html>

 

 

Gonder.aspx Code Behind

    protectedvoid ButtonSendToast_Click(object sender, EventArgs e)

        {

            try

            {

                string subscriptionUri = TextBoxUri.Text.ToString();

 

 

                HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);

                sendNotificationRequest.Method = "POST";

 

                string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +

                "<wp:Notification xmlns:wp=\"WPNotification\">" +

                   "<wp:Toast>" +

                        "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" +

                        "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" +

                        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +

                   "</wp:Toast> " +

                "</wp:Notification>";

 

                byte[] notificationMessage = Encoding.Default.GetBytes(toastMessage);

 

                sendNotificationRequest.ContentLength = notificationMessage.Length;

                sendNotificationRequest.ContentType = "text/xml";

                sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");

                sendNotificationRequest.Headers.Add("X-NotificationClass", "2");

 

 

                using (Stream requestStream = sendNotificationRequest.GetRequestStream())

                {

                    requestStream.Write(notificationMessage, 0, notificationMessage.Length);

                }

 

               

                HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();

                string notificationStatus = response.Headers["X-NotificationStatus"];

                string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];

                string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

 

                TextBoxResponse.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;

            }

            catch (Exception ex)

            {

                TextBoxResponse.Text = "Exception caught sending update: " + ex.ToString();

            }

        }

 

 

İlk olarak Client’ı yani WinPhone projemizi çalıştırıyoruz VisualStudio’da bulunan Output sayfasında uygulamamazın oluşturduğu URL'i aşağıda olduğu şekilde alıyoruz

 

Sonrasında Server tarafını yani Asp.Net projemizi çalıştırıyoruz Gerekli yerleri doldurup Send Toas Notification butonuna tıklıyoruz ve göndermiş olduğumuz mesaj Windows Phone Uygulamamızda resimde olduğu gibi görünüyor.

 

Uygulamanın kaynak kodlarını buradan indirebilirsiniz. 

 

Mobil Alanda NFC

Çalışma Şekli ;

  • Yakın alan iletişimi iki devrenin birbirine gevşekçe bağlı olduğu bir kaç santimetre mesafe ile güç ve veri paylaştığı endüktif kuplaj üzerine kurulmuştur. NFC cihazlar teknik özellik olarak RFID etiket ve temassız akıllı kartlarla benzerlik gösterse de farklı özelliklerde barındırmaktadır.
  • Çalışması için 2 cihazında aktif olması gerekmemektedir,  bir aktif ve bir pasif cihazla da çalışmaktadır. Bu şekilde çalışıyor olması güvenlik açısından büyük önem taşımaktadır, ve kullanıcılar sadece NFC den yararlanmak istediklerinde uygulama aktif hale gelir.

 
Veri İletim Hızı ;

  • NFC veri aktarım hızı saniye başına kilo bit (kbps) olarak ölçülür. NFC standardı mevcut altyapılar ile birlikte çalışabilmek için farklı hızları desteklemektedir. Mevcut hızlar 106 kbps, 212 kbps ve 424 kbps'dır.

NFC Uyumlu Cihaz ile NFC Etiketi Arasındaki Fark ;

  • NFC uyumlu cihaz okuyucu/yazıcı ve birebir (P2P) modu ve kart emülasyon modunda çalışabilir. NFC etiketi ise pasif bir cihaz olup NFC uyumlu cihaz tarafından okunabilen veri depolar.

 
Temassız Kart ile Etiket Arasındaki Fark ;

  • Teknik olarak bir temassız kart ve etiket birbirinin aynıdır. Ancak, ödeme ve biletlemede kullanılan temassız kartlar güvenlik gerektiren veriyi depolayabilecek ilave teknolojiye sahip olabilir.

 

 Türkiye’de NFC

  • İlk olarak Avea ve Turkcell tarafından kullanıldı.
  • Turkcell, “Turkcell Cep-T Cüzdan” Servisi kullanıma sunuldu.
  • Turkcell T20 dünyada Android işletim sistemi ile çalışan ilk standart NFC cihazlardan biri.
  • BlackBerry Bold 9900 “Turkcell Cep-T Cüzdan” ile Türkiye’nin birçok yerinde MasterCard PayPass okuyucusuna dokundurarak işlem yapılabiliyor.
  • 35 TL’ye kadar kullanım sınırı bulunmakta.

NFC Nedir ?

NFC, 2004 yılında Nokia, Sony ve NXP’nin 2004 yılında bir araya gelerek oluşturduğu bir temassız iletişim standardıdır.

 

 

  • NFC haberleşmesi iki NFC uyumlu cihazın birbirine birkaç santimetre yaklaştırılması ile aktifleştirilir. NFC uygulamaları; ödeme ve toplu taşıma biletleri gibi temassız işlemleri, takvim senkronizasyonu veya elektronik kartvizit gibi basit ve hızlı veri transferini ve dijital içeriklere erişimi kapsamaktadır.

 

  • NFC’ yi diğer ağ teknolojilerinden ayıran en büyük özellik iki NFC cihaz arasındaki bağlantının saniyenin onda birinden daha kısa sürede sağlanmasıdır ve böylelikle son kullanıcıyı bekletmeden veri transferini sağlamaktadır.

 

  • NFC sadece cep telefonu ile temassız ödeme veya veri transferi yapmak demek değildir, temassız iletişim sağlayan cihazlar için oluşturulan standardın adıdır.

 

  • Günlük hayatta Cep telefonları, turnikeler, otomatlar, parkmetreler, POS’ lar, ATM’ ler, ofis, ev veya garaj kapıları, kişisel bilgisayarlar, posterler... vb. birçok alanda kullanılması beklenmektedir.

 

 

Asmx ve WCF Arasındaki Farklar

  • Asmx SOAP ve Http kullanarak mesajlaşabilirken, WCF default olarak Http olmasıyla birlitke TCP/IP, MSMQ, NamedPipes etc. gibi yapıları da kullanabilmekte.

 

  • Asmx servisler sadece IIS üzerinde Host edilebilirken, WCF IIS, WAS (Windows Process Activation Services), Console Application, Windows NT Services üzerinde host edilebilmektedir.

 

  • Asmx’de güvenlik sınırlıdır. Kimlik doğrulama ve yetkilendirme işlemleri IIS,  Asp.Net ve TCP Protokolü kullanılarak yapılır ve kesin bir güvenlik tutarlılığı yoktur. WCF her bir protokol için ayrı bir güvenlik hizmeti sağlar ve bu yönden daha tutarlı bir güvenlik alt yapısına sahiptir.

 

  • Asmx’de class’a [WebService] tag’i eklenmeliyken, WCF’de class’a [ServiceContract] tag’i eklenmelidir

 

  • Asmx serilization işlemi için XmlSerializer kullanırken WCF XmlSerializer’den daha performanslı olan DataContractSerializer’ı kullanır.