none
console da sorun !!

    Soru

  • ilk önce koları vereyim sonra sorunumu anlatayım

                        

     SqlConnection cnn = new SqlConnection("Data Source=EMEKTAR\\IBRAHIM;Initial Catalog=ibrahim;Integrated Security=True;Pooling=False");
                byte i; string a, b, c; int d;
                Console.Write("Kayıt için 1'e giriş için 2' ye silmek için 3' e  basın .. : ");
                i = Convert.ToByte(Console.ReadLine());
                if (i == 1)
                {
                    Console.Clear();
                    Console.Write("İsim .. : ");
                    a = Console.ReadLine();
                    Console.Write("S. İsim : ");
                    b = Console.ReadLine();
                    Console.Write("K. Adi .: ");
                    c = Console.ReadLine();
                    Console.Write("Şifre ..: ");
                    d = Convert.ToInt16(Console.ReadLine());
                    cnn.Open();
                    SqlCommand cmd = new SqlCommand("INSERT INTO giris(adi,soy_adi,k_adi,sifre) VALUES ('" + a + "','" + b + "','" + c + "','" + d + "')", cnn);

                    SqlDataReader rd = cmd.ExecuteReader();
                    if (rd.Read())
                     {
                        Console.Write("Ekleme başarılı ");
                     }
                    cnn.Close();
                }
                Console.ReadLine();

    şimdi burda işlevi sorunsuz bir şekilde yapıyo sql e kaydediyo tek sorun 

     if (rd.Read())
                     {
                        Console.Write("Ekleme başarılı ");
                     }

    burda ekleme başarılı mesajını göstermiyo

    veri tabanına bakıyorum acaba kayıt işlemi olmu yomu diye ama veriler sqle başarılı bir şekilde ekleniyo bu konuda yardım edermisiniz ...

    21 Haziran 2012 Perşembe 13:47

Yanıtlar

  • Bence mi:) Ben cok uzun yillardir SQL ile calisiyorum ve son yillarda da Linq ile. Dogal olarak SQL bilgim daha fazla. Ancak buna ragmen bazen Linq'yu sadece complex SQL'in yazimini bulmak icin kullaniyorum:) Su anda kullanabildigim yerlerde Linq tercihim.

    Linq,
    -SQL aksine sadece tablolarla calismiyor. Numaralanabilen (enumerated) herseyle, ben ozetle cogul sekli olan hersey diyorum, calisiyor. Ornegin File(s). Demekki diskteki dosyalar sorgulanabilir:

    DirectoryInfo di = new DirectoryInfo(@"c:\temp");
    
    var result = from f in di.GetFiles()
                 orderby f.Extension.ToLower(), f.Name
                 group f by f.Extension.ToLower();
    
    foreach (var g in result)
    {
      Console.WriteLine (g.Key);
      foreach (var f in g)
      {
        Console.WriteLine ("\t{0}",f.Name);
      }
    }

    Process(ler), string bir karakter(ler) dizisi oyleyse string ... Ornegin:

    int sonuc = "Bu cumlede kac tane 'e' harfi var".Count( c => c == 'e');

    -Bir nesne sorgulama dili. Bu nedenle C# gibi nesneye yonelik bir dilde daha dogal bir sorgulama demek. Ornegin:

    ( Northwind ornek veri tabani ile. Customers - > Orders - > OrderDetails seklinde yapi var)

    Musterilerin ID, region, country yaninda
    1) ilk ve son alisveris tarihleri
    2) toplam alis miktarini (urun.fiyat * urun.sayi toplami)
    istiyorum. Linq ile:

    var AComplexQuery = 
    	from c in Customers 
    	let odTotal = c.Orders.Count() == 0?0m:c.Orders.Sum( o => o.OrderDetails.Sum(od => od.Quantity * od.UnitPrice))
    	//where odTotal > 50000m 
    	select new {
    	  c.CustomerID, c.Region, c.Country,  
    	 first = c.Orders.Count() == 0?null:c.Orders.Min( o => o.OrderDate ), 
         last  = c.Orders.Count() == 0?null:c.Orders.Max( o => o.OrderDate ),
         total = odTotal };

    Bu ilk bakista karisik gorunebilir, ozellikle de Northwind tablosunu bilmiyorsaniz. O zaman bu sorgunun SQL karsiligina bakin:) * ben yazmadim, Linq'nun SQL server'a gonderdigi SQL. Ben yazsaydim daha az karmasik olsa da pek de farkli olmazdi:

    -- Region Parameters
    DECLARE @p0 Int SET @p0 = 0
    DECLARE @p1 Decimal(1,0) SET @p1 = 0
    DECLARE @p2 Int SET @p2 = 0
    DECLARE @p3 Int SET @p3 = 0
    -- EndRegion
    SELECT [t6].[CustomerID], [t6].[Region], [t6].[Country], 
        (CASE 
            WHEN ((
                SELECT COUNT(*)
                FROM [Orders] AS [t7]
                WHERE [t7].[CustomerID] = [t6].[CustomerID]
                )) = @p2 THEN NULL
            ELSE (
                SELECT MIN([t8].[OrderDate])
                FROM [Orders] AS [t8]
                WHERE [t8].[CustomerID] = [t6].[CustomerID]
                )
         END) AS [first], 
        (CASE 
            WHEN ((
                SELECT COUNT(*)
                FROM [Orders] AS [t9]
                WHERE [t9].[CustomerID] = [t6].[CustomerID]
                )) = @p3 THEN NULL
            ELSE (
                SELECT MAX([t10].[OrderDate])
                FROM [Orders] AS [t10]
                WHERE [t10].[CustomerID] = [t6].[CustomerID]
                )
         END) AS [last], [t6].[value] AS [total]
    FROM (
        SELECT [t0].[CustomerID], [t0].[Region], [t0].[Country], 
            (CASE 
                WHEN ((
                    SELECT COUNT(*)
                    FROM [Orders] AS [t1]
                    WHERE [t1].[CustomerID] = [t0].[CustomerID]
                    )) = @p0 THEN CONVERT(Decimal(33,4),@p1)
                ELSE CONVERT(Decimal(33,4),(
                    SELECT SUM([t5].[value])
                    FROM (
                        SELECT (
                            SELECT SUM([t4].[value])
                            FROM (
                                SELECT (CONVERT(Decimal(29,4),[t3].[Quantity])) * [t3].[UnitPrice] AS [value], [t3].[OrderID]
                                FROM [Order Details] AS [t3]
                                ) AS [t4]
                            WHERE [t4].[OrderID] = [t2].[OrderID]
                            ) AS [value], [t2].[CustomerID]
                        FROM [Orders] AS [t2]
                        ) AS [t5]
                    WHERE [t5].[CustomerID] = [t0].[CustomerID]
                    ))
             END) AS [value]
        FROM [Customers] AS [t0]
        ) AS [t6]
    

    -Linq lokal veride, normalde SQL ile yapamadigin bazi seylere de izin veriyor. Ornegin, SQL serverdan aldigin veriye ya da diskteki dosyalara "siraNo" ekleyebiliyor, ilk, son vs diyebiliyorsun. Her bir eleman ile bir metod calistirip sonucunu alabiliyorsun. ornegin:
    dizideki tek sayi olan son sayi nedir?

    Console.WriteLine ( (new int[] {1,5,19,3,59,8}).Last (v => v % 2 == 1) ); // 59

    -Linq To Entity Framework (L2E) kullaniyorsan, veri tabanindan bagimsiz kod yaziyorsun demektir. Normalde SQL her ne kadar ANSI diye bir standarda bagli olsa da, gercekte hemen hemen her veri tabani bu ANSI standardinin disinda birseyler yapiyor. Destekledikleri fonksiyonlar vs ayni degil. Baska sekilde soylemek gerekirse, SQL server ile yazdigin SQL'i alip Oracle, MySQL, PostgreSQL, Db2, Firebird, SQLite ... adindaki onlarca veri tabaninda aynen kullanamiyorsun. L2E kullanirsan isler degisiyor. Sen o zaman veri tabanini dusunmuyorsun. O aradaki L2E providerin isi. Yani seni Linq driveri var mi, L2E provideri var mi kismi ilgilendiriyor. L2E yavasligi nedeniyle elestiriliyor. Ancak o tamamen ayri bir tartisma konusu. Bu tartismaya girebilmek icin once SQL seviyesinde optimizasyonlari biliyor olmak gerekiyor. Arti, EF gelisen birsey. .Net 1.0 zamaninda data islemleri kaplumbaga hizindaydi. 2.0'da dramatik hizlanmaya basladi. EF'de simdilik goreceli olarak genc. Tabii yine de uygulama ve veri belirler o "yavaslama"nin senin icin kullanilabilir olup olmamasini.

    -Linq'nun bircok yetenegi ve tipleri var (paralel Linq, Linq to XML, linq to objects ...). SQL ile islerini yurutmeye devam ediyor olsan bile Linq ogrenmen gerekiyor yani.

    -Bazi veri tabanlari (ki yenilerin cogu), artik SQL veri tabani degil, NoSQL veri tabani. SQL tabanlarinin yetersiz kalmasi nedeniyle, ya da object oriented ortamlari dogrudan desteklemek icin filan ortaya ciktilar. Bu veri tabanlarinin Linq destegi olmayabiliyor (bir cogunun var). Olmasa bile bu veri tabanlari zaten daha cok nesne bazli ya da ona benzer key-value, object graph vs Bu veri tabanlariyla da kullanilan dil genelde SQL degil, onun yerine, objectquery, linq, json ... olabiliyor.

    SQL ogrenme DEMIYORUM. Ogrenebiliyorsan ogren. Ogrenmenin fazlasi insani zehirlemez (suyun bile fazlasi zehirler ama ogrenmekten zehirlenen olmadi:)

     

    • Yanıt Olarak İşaretleyen Aithusa 22 Haziran 2012 Cuma 12:17
    22 Haziran 2012 Cuma 09:33
  • Cunku Insert bir sorgu islemi degil. Bu komutla Reader'in ilgisi yok. Onun yerine:

    int etkilenenKayitSayisi = cmd.ExecuteNonQuery();
    
    if (etkilenenKayitSayisi != 0)
    { 
      // basarili
    }
    
    

    Yaptigin kaydi geri okuyup kontrol etmek istiyorsan:

    SqlCommand cmdKontrol = 
     new SqlCommand("select count(*) from giris where adi=@adi and soy_adi = @soyadi and k_adi = @kAdi and sifre = @sifre", cnn);
    
    cmdControl.AddWithValue("@adi", a);
    cmdControl.AddWithValue("@soyadi", b);
    cmdControl.AddWithValue("@kAdi", c);
    cmdControl.AddWithValue("@sifre", d);
    
    int sayi = cmdKontrol.ExecuteScalar();
    
    if (sayi = 0) // basarisiz

    Bu arada komutu asla oyle + a + ... seklinde yazma. Oyle yazarsan ve hata yoksa calisir ve hatalarin en buyuguyle yazmaya alismis olursun. "SQL injection attack" seklinde arama yaparsan, video dahil ne demek istedigimi gorursun. En onemli hatalardan birisi. Oyle baslarsan oyle gider.

    Bir de istersen Linq ogren.

    • Yanıt Olarak İşaretleyen Aithusa 21 Haziran 2012 Perşembe 14:37
    21 Haziran 2012 Perşembe 14:23

Tüm Yanıtlar

  • Cunku Insert bir sorgu islemi degil. Bu komutla Reader'in ilgisi yok. Onun yerine:

    int etkilenenKayitSayisi = cmd.ExecuteNonQuery();
    
    if (etkilenenKayitSayisi != 0)
    { 
      // basarili
    }
    
    

    Yaptigin kaydi geri okuyup kontrol etmek istiyorsan:

    SqlCommand cmdKontrol = 
     new SqlCommand("select count(*) from giris where adi=@adi and soy_adi = @soyadi and k_adi = @kAdi and sifre = @sifre", cnn);
    
    cmdControl.AddWithValue("@adi", a);
    cmdControl.AddWithValue("@soyadi", b);
    cmdControl.AddWithValue("@kAdi", c);
    cmdControl.AddWithValue("@sifre", d);
    
    int sayi = cmdKontrol.ExecuteScalar();
    
    if (sayi = 0) // basarisiz

    Bu arada komutu asla oyle + a + ... seklinde yazma. Oyle yazarsan ve hata yoksa calisir ve hatalarin en buyuguyle yazmaya alismis olursun. "SQL injection attack" seklinde arama yaparsan, video dahil ne demek istedigimi gorursun. En onemli hatalardan birisi. Oyle baslarsan oyle gider.

    Bir de istersen Linq ogren.

    • Yanıt Olarak İşaretleyen Aithusa 21 Haziran 2012 Perşembe 14:37
    21 Haziran 2012 Perşembe 14:23
  • teşekkürler LINQ öğrenmeye niyetliyim zaten :)  sizce linq mu yoksa sql mi daha kolay ve linq ile sql işlemlerinin hepsi yapılabiliyor mu ?



    • Düzenleyen Aithusa 21 Haziran 2012 Perşembe 14:55
    21 Haziran 2012 Perşembe 14:37
  • Bence mi:) Ben cok uzun yillardir SQL ile calisiyorum ve son yillarda da Linq ile. Dogal olarak SQL bilgim daha fazla. Ancak buna ragmen bazen Linq'yu sadece complex SQL'in yazimini bulmak icin kullaniyorum:) Su anda kullanabildigim yerlerde Linq tercihim.

    Linq,
    -SQL aksine sadece tablolarla calismiyor. Numaralanabilen (enumerated) herseyle, ben ozetle cogul sekli olan hersey diyorum, calisiyor. Ornegin File(s). Demekki diskteki dosyalar sorgulanabilir:

    DirectoryInfo di = new DirectoryInfo(@"c:\temp");
    
    var result = from f in di.GetFiles()
                 orderby f.Extension.ToLower(), f.Name
                 group f by f.Extension.ToLower();
    
    foreach (var g in result)
    {
      Console.WriteLine (g.Key);
      foreach (var f in g)
      {
        Console.WriteLine ("\t{0}",f.Name);
      }
    }

    Process(ler), string bir karakter(ler) dizisi oyleyse string ... Ornegin:

    int sonuc = "Bu cumlede kac tane 'e' harfi var".Count( c => c == 'e');

    -Bir nesne sorgulama dili. Bu nedenle C# gibi nesneye yonelik bir dilde daha dogal bir sorgulama demek. Ornegin:

    ( Northwind ornek veri tabani ile. Customers - > Orders - > OrderDetails seklinde yapi var)

    Musterilerin ID, region, country yaninda
    1) ilk ve son alisveris tarihleri
    2) toplam alis miktarini (urun.fiyat * urun.sayi toplami)
    istiyorum. Linq ile:

    var AComplexQuery = 
    	from c in Customers 
    	let odTotal = c.Orders.Count() == 0?0m:c.Orders.Sum( o => o.OrderDetails.Sum(od => od.Quantity * od.UnitPrice))
    	//where odTotal > 50000m 
    	select new {
    	  c.CustomerID, c.Region, c.Country,  
    	 first = c.Orders.Count() == 0?null:c.Orders.Min( o => o.OrderDate ), 
         last  = c.Orders.Count() == 0?null:c.Orders.Max( o => o.OrderDate ),
         total = odTotal };

    Bu ilk bakista karisik gorunebilir, ozellikle de Northwind tablosunu bilmiyorsaniz. O zaman bu sorgunun SQL karsiligina bakin:) * ben yazmadim, Linq'nun SQL server'a gonderdigi SQL. Ben yazsaydim daha az karmasik olsa da pek de farkli olmazdi:

    -- Region Parameters
    DECLARE @p0 Int SET @p0 = 0
    DECLARE @p1 Decimal(1,0) SET @p1 = 0
    DECLARE @p2 Int SET @p2 = 0
    DECLARE @p3 Int SET @p3 = 0
    -- EndRegion
    SELECT [t6].[CustomerID], [t6].[Region], [t6].[Country], 
        (CASE 
            WHEN ((
                SELECT COUNT(*)
                FROM [Orders] AS [t7]
                WHERE [t7].[CustomerID] = [t6].[CustomerID]
                )) = @p2 THEN NULL
            ELSE (
                SELECT MIN([t8].[OrderDate])
                FROM [Orders] AS [t8]
                WHERE [t8].[CustomerID] = [t6].[CustomerID]
                )
         END) AS [first], 
        (CASE 
            WHEN ((
                SELECT COUNT(*)
                FROM [Orders] AS [t9]
                WHERE [t9].[CustomerID] = [t6].[CustomerID]
                )) = @p3 THEN NULL
            ELSE (
                SELECT MAX([t10].[OrderDate])
                FROM [Orders] AS [t10]
                WHERE [t10].[CustomerID] = [t6].[CustomerID]
                )
         END) AS [last], [t6].[value] AS [total]
    FROM (
        SELECT [t0].[CustomerID], [t0].[Region], [t0].[Country], 
            (CASE 
                WHEN ((
                    SELECT COUNT(*)
                    FROM [Orders] AS [t1]
                    WHERE [t1].[CustomerID] = [t0].[CustomerID]
                    )) = @p0 THEN CONVERT(Decimal(33,4),@p1)
                ELSE CONVERT(Decimal(33,4),(
                    SELECT SUM([t5].[value])
                    FROM (
                        SELECT (
                            SELECT SUM([t4].[value])
                            FROM (
                                SELECT (CONVERT(Decimal(29,4),[t3].[Quantity])) * [t3].[UnitPrice] AS [value], [t3].[OrderID]
                                FROM [Order Details] AS [t3]
                                ) AS [t4]
                            WHERE [t4].[OrderID] = [t2].[OrderID]
                            ) AS [value], [t2].[CustomerID]
                        FROM [Orders] AS [t2]
                        ) AS [t5]
                    WHERE [t5].[CustomerID] = [t0].[CustomerID]
                    ))
             END) AS [value]
        FROM [Customers] AS [t0]
        ) AS [t6]
    

    -Linq lokal veride, normalde SQL ile yapamadigin bazi seylere de izin veriyor. Ornegin, SQL serverdan aldigin veriye ya da diskteki dosyalara "siraNo" ekleyebiliyor, ilk, son vs diyebiliyorsun. Her bir eleman ile bir metod calistirip sonucunu alabiliyorsun. ornegin:
    dizideki tek sayi olan son sayi nedir?

    Console.WriteLine ( (new int[] {1,5,19,3,59,8}).Last (v => v % 2 == 1) ); // 59

    -Linq To Entity Framework (L2E) kullaniyorsan, veri tabanindan bagimsiz kod yaziyorsun demektir. Normalde SQL her ne kadar ANSI diye bir standarda bagli olsa da, gercekte hemen hemen her veri tabani bu ANSI standardinin disinda birseyler yapiyor. Destekledikleri fonksiyonlar vs ayni degil. Baska sekilde soylemek gerekirse, SQL server ile yazdigin SQL'i alip Oracle, MySQL, PostgreSQL, Db2, Firebird, SQLite ... adindaki onlarca veri tabaninda aynen kullanamiyorsun. L2E kullanirsan isler degisiyor. Sen o zaman veri tabanini dusunmuyorsun. O aradaki L2E providerin isi. Yani seni Linq driveri var mi, L2E provideri var mi kismi ilgilendiriyor. L2E yavasligi nedeniyle elestiriliyor. Ancak o tamamen ayri bir tartisma konusu. Bu tartismaya girebilmek icin once SQL seviyesinde optimizasyonlari biliyor olmak gerekiyor. Arti, EF gelisen birsey. .Net 1.0 zamaninda data islemleri kaplumbaga hizindaydi. 2.0'da dramatik hizlanmaya basladi. EF'de simdilik goreceli olarak genc. Tabii yine de uygulama ve veri belirler o "yavaslama"nin senin icin kullanilabilir olup olmamasini.

    -Linq'nun bircok yetenegi ve tipleri var (paralel Linq, Linq to XML, linq to objects ...). SQL ile islerini yurutmeye devam ediyor olsan bile Linq ogrenmen gerekiyor yani.

    -Bazi veri tabanlari (ki yenilerin cogu), artik SQL veri tabani degil, NoSQL veri tabani. SQL tabanlarinin yetersiz kalmasi nedeniyle, ya da object oriented ortamlari dogrudan desteklemek icin filan ortaya ciktilar. Bu veri tabanlarinin Linq destegi olmayabiliyor (bir cogunun var). Olmasa bile bu veri tabanlari zaten daha cok nesne bazli ya da ona benzer key-value, object graph vs Bu veri tabanlariyla da kullanilan dil genelde SQL degil, onun yerine, objectquery, linq, json ... olabiliyor.

    SQL ogrenme DEMIYORUM. Ogrenebiliyorsan ogren. Ogrenmenin fazlasi insani zehirlemez (suyun bile fazlasi zehirler ama ogrenmekten zehirlenen olmadi:)

     

    • Yanıt Olarak İşaretleyen Aithusa 22 Haziran 2012 Cuma 12:17
    22 Haziran 2012 Cuma 09:33
  • mecbur öğrencem sqli :) çünkü seneye okulda veri tabanı programcılığı dersinde sql öğrencez ama verdiğin bilgilere baklacak ve geleceğin teknolojilerine bakacak olursak sqlde kalmamak gerektiğini anlamdım bu arada ilgin için teşekürler ... 
    22 Haziran 2012 Cuma 12:19