none
C# sql tabloya veri eklerken sona ekleme RRS feed

  • Soru

  • İyi günler arkadaşlar

    C# da sql'ile tabloya veri ekliyorum. Eklerken bi süre sonra eklediğim malzemeler sona değil aralara ekleniyor. ben bu malzemeleri eklerken bir da başka bir sutuna tarih ekliyorum. eklenilen tarihlere baktığımda normalde hepsinin artması gerekirken bi yerden sonra tarih geçmişten başlıyıp devam ediyor sonra düzeliyor. böyle devam ettikten sonra tekrar geçmişe dönüyor. yani eklediğim veriler hep tablonun en sonuna eklenmiyor. Bunu nasıl düzeltebilitim.

    Tablomdaki verilere şu şekilde:

    Farklı bilgisayarlardan sql'e bağlanıldığı için farklı bilgisayarların kadettiği tarih formatı da birbirinden farklı oluyor.
    2 Mart 2020 Pazartesi 10:08

Yanıtlar

Tüm Yanıtlar

  • "gerekirken" ? Neye gore?

    SQL Server veriyi fiziksel olarak tarih sırasında, ya da giriş sırasında eklemek zorunda degil. Sorguda da asla ve asla öyle dondurecegini garanti etmiyor.

    Belli bir sıraya  gore insert edilmesini istiyorsanız o siraya gore bir CLUSTERED indexiniz olmalı.  

    Sorguda da, belli bir siraya gore almak istiyorsanız o siraya gore bir ORDER BY olmalı.




    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    2 Mart 2020 Pazartesi 13:33
  • Merhabalar, tablonun bir örneğini atabilirmisiniz ? PrimaryKey bölümü sayısalmıdır ? eğer metinsel bir değerse, alfabetik düzenleyecektir. veriler ona göre sıralanacaktır. Primary key değerinizin veri türü nedir? 
    2 Mart 2020 Pazartesi 15:12
  • Merhabalar, tablonun bir örneğini atabilirmisiniz ? PrimaryKey bölümü sayısalmıdır ? eğer metinsel bir değerse, alfabetik düzenleyecektir. veriler ona göre sıralanacaktır. Primary key değerinizin veri türü nedir? 
    Bu doğru degil. Primary key ne olursa olsun, CLUSTERED index varsa, o indexe gore siralanacaktir.


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    2 Mart 2020 Pazartesi 15:15
  • "gerekirken" ? Neye gore?

    SQL Server veriyi fiziksel olarak tarih sırasında, ya da giriş sırasında eklemek zorunda degil. Sorguda da asla ve asla öyle dondurecegini garanti etmiyor.

    Belli bir sıraya  gore insert edilmesini istiyorsanız o siraya gore bir CLUSTERED indexiniz olmalı.  

    Sorguda da, belli bir siraya gore almak istiyorsanız o siraya gore bir ORDER BY olmalı.




    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Tabloda CLUSTERED index'im yok. primary key'de tanımlamadım. şimdi bakıyorum Clustered index'e. (Soruyu düzenleyerek bir de ekran görüntüsü ekledim)

    3 Mart 2020 Salı 06:01
  • Merhabalar, tablonun bir örneğini atabilirmisiniz ? PrimaryKey bölümü sayısalmıdır ? eğer metinsel bir değerse, alfabetik düzenleyecektir. veriler ona göre sıralanacaktır. Primary key değerinizin veri türü nedir? 
    Tablomda primary key'in bulunmasını gerektiren bir durum olmadığı için ben primary key tanımlamadım.
    3 Mart 2020 Salı 06:02
  • lütfen çözüm önerirken diğerlerinin, çözümlerini eleştirmeyiniz.  CLUSTERED index iyi bir yöntem değildir. birde sadece sıralama yapsın diye kullanılacak bir yöntem değildir. Sizden ricam benim verdiğim cevaplara yorum yapmamanızdır. 
    3 Mart 2020 Salı 08:46
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi
    3 Mart 2020 Salı 08:48
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi

    Hakikaten kendi fikriniz olmalı. Neden, siz aksini özellikle belirmedikce, primary key indexlerin CLUSTERED olduğu gerceğini de eklemediniz?

    Sorguda siralama icin gerekli olan indexler degil ORDER BY'dir. Cop ile samani karistirmayiniz.

    Yanlış bilgiler verdiginizde yorum yapilmasini istemiyorsanız, hiç vermeyiniz. Forumlarda yanlış seylerin yazilmasi ve bunların duzeltilmemesini istemek doğru degil.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    3 Mart 2020 Salı 10:00
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi

    Hakikaten kendi fikriniz olmalı. Neden, siz aksini özellikle belirmedikce, primary key indexlerin CLUSTERED olduğu gerceğini de eklemediniz?

    Sorguda siralama icin gerekli olan indexler degil ORDER BY'dir. Cop ile samani karistirmayiniz.

    Yanlış bilgiler verdiginizde yorum yapilmasini istemiyorsanız, hiç vermeyiniz. Forumlarda yanlış seylerin yazilmasi ve bunların duzeltilmemesini istemek doğru degil.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    Cetin abi yukarıda resmini verdiğim tabloyu ORDER BY' ile sorguda nasıl bir sıralama yaptırabilirim ki ilk eklediğimden son eklediğime göre sıralı gelsin. Yukarıda tarih kısımları sitring ile birleştirilmiş. ve her PC'nin tarih kaydı diğerinden farklı oluyor. Mesela GG/AA/YYYY yada AA/GG/YYYY şeklinde. Ayrıyeten bir stun daha eklemek istemiyorum primary key için. Bunu tabloya eklerken her zaman sona eklemem mümkün olmaz mı?
    3 Mart 2020 Salı 11:32
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi
    Merhabalar Murat bey. Daha önce bu şekilde bir tablo yapmıştım o zaman identy'i sürekli kendisi artsın şeklinde bir yapı kullanmuştım. (Yanlış hatırmaıyorsam) Her eklediğim veriyi sona ekliyor bir öncekinden farklı bir ID ile ekliyordu. ID'de artan sayılardan oluşluyordu. Ama burda bunun için ayrı bir sütunum yok. Galiba sizin dediğiniz yanlış anlamadıysam bu şekilde bir şey. Doğru mudur?
    3 Mart 2020 Salı 11:34
  • Yukaridaki resimdeki tablo ne yazık ki bir felaket. Tarih ve saat bilgisi içeren degerler, öyle 'kafasına gore' string degerler olarak tutulmaz, date\datetime* gibi data tipleriyle tutulur. Oradaki veriyi parse edip, sonra da try_convert ile çevirmeyi deneyebilirsiniz ancak pek de ise yaramayacak cunku:

    2/14/2020 ...
    29.02.2020 ...

    gibi degerler var. Anladık ilki 14 Şubat 2020, ikincisi 29 Şubat 2020. Peki ya bu ne?:

    3/2/2020 11:50:59
    2.03.2020 12:17:40

    Bunlar 3 Şubat 2020 ya da 2 Mart 2020 olabilir. Verinin geneline bakınca, sanki tum MM/dd/yyyy formatindekiler / kullanmış, gg.MM.yyyy ise .

    Oyle düşününce de o veri sıralı gibi duruyor. 

    Bence, bu mantıkla, try_convert kullanarak tum o veriyi yeniden güncelleyebilirsiniz, ve o kolona veri girişini durdurup, dosdoğru birisi datetime2, digeri varchar 2 kolon olarak kullanirsiniz. Bu sekilde devam edecekseniz veriniz Allah'a emanet :(

    Not: Bu arada bu tablonun primary key'si ne?



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    3 Mart 2020 Salı 12:09
  • Yukaridaki resimdeki tablo ne yazık ki bir felaket. Tarih ve saat bilgisi içeren degerler, öyle 'kafasına gore' string degerler olarak tutulmaz, date\datetime* gibi data tipleriyle tutulur. Oradaki veriyi parse edip, sonra da try_convert ile çevirmeyi deneyebilirsiniz ancak pek de ise yaramayacak cunku:

    2/14/2020 ...
    29.02.2020 ...

    gibi degerler var. Anladık ilki 14 Şubat 2020, ikincisi 29 Şubat 2020. Peki ya bu ne?:

    3/2/2020 11:50:59
    2.03.2020 12:17:40

    Bunlar 3 Şubat 2020 ya da 2 Mart 2020 olabilir. Verinin geneline bakınca, sanki tum MM/dd/yyyy formatindekiler / kullanmış, gg.MM.yyyy ise .

    Oyle düşününce de o veri sıralı gibi duruyor. 

    Bence, bu mantıkla, try_convert kullanarak tum o veriyi yeniden güncelleyebilirsiniz, ve o kolona veri girişini durdurup, dosdoğru birisi datetime2, digeri varchar 2 kolon olarak kullanirsiniz. Bu sekilde devam edecekseniz veriniz Allah'a emanet :(



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    Haklısın abi bunu böyle yapmamak lazımdı. ama bunu datetime.now yazınca farklı pc'lerdeki aynı program bu şekilde kayıt etmiş ben böyle olacağını bilmiyordum. Şimdi yapacağım şey tarih verileri ile bu string verileri birbirinden ayırmak olacak. sonra da tarih verilerine göre sıralayabilirim. diye düşünüyorum. Ayrıca'pc'lerde tarih formatını gg/aa/yy şeklinde kayıt edebilemesi için programda güncelleme yapacam.. 
    3 Mart 2020 Salı 12:17
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi

    Merhabalar Murat bey. Daha önce bu şekilde bir tablo yapmıştım o zaman identy'i sürekli kendisi artsın şeklinde bir yapı kullanmuştım. (Yanlış hatırmaıyorsam) Her eklediğim veriyi sona ekliyor bir öncekinden farklı bir ID ile ekliyordu. ID'de artan sayılardan oluşluyordu. Ama burda bunun için ayrı bir sütunum yok. Galiba sizin dediğiniz yanlış anlamadıysam bu şekilde bir şey. Doğru mudur?

    Identity primary key kullanınca otomatikman o artan sırayla bir CLUSTERED index oluşturuluyor. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    3 Mart 2020 Salı 12:18
  • Merhabalar,  CLUSTERED index'ler tabloyu yoran yapılardır çok gerekmedikçe tavsiye etmem (kendi fikrim) onun yeriine identity bir alan ekleyip ona göre sıralama yaptırabilirsiniz. Primary key harici farklı yöntemler deneyebilirsiniz bu söylediğim bunlardan birtanesi

    Merhabalar Murat bey. Daha önce bu şekilde bir tablo yapmıştım o zaman identy'i sürekli kendisi artsın şeklinde bir yapı kullanmuştım. (Yanlış hatırmaıyorsam) Her eklediğim veriyi sona ekliyor bir öncekinden farklı bir ID ile ekliyordu. ID'de artan sayılardan oluşluyordu. Ama burda bunun için ayrı bir sütunum yok. Galiba sizin dediğiniz yanlış anlamadıysam bu şekilde bir şey. Doğru mudur?
    Doğrudur. Tablo içine sütun ekleme şansınız varsa ekstra bir sütun ekleyerek çözebilirsiniz. Dediğim gibi çok farklı şekillerde çözüm üretebilirsiniz.  tablo üzerinde değişiklik yapma şansınız varsa sayısal bir sütun ekleyip Identity olarak düzenlerseniz verileri çekerken o alandan faydalanabilirsiniz. Metinsel alanlarda Index yapısı kullansanızda, sonuçta indexlemeyi sıralamaya göre yapacaktır. Eklediğiniz verileri A'dan Z'ye sıralayacaktır  (NOT : Index Kullanmak istemediğinize istinaden farklı yöntemler yazıyorum)
    3 Mart 2020 Salı 15:37
  • Yukaridaki resimdeki tablo ne yazık ki bir felaket. Tarih ve saat bilgisi içeren degerler, öyle 'kafasına gore' string degerler olarak tutulmaz, date\datetime* gibi data tipleriyle tutulur. Oradaki veriyi parse edip, sonra da try_convert ile çevirmeyi deneyebilirsiniz ancak pek de ise yaramayacak cunku:

    2/14/2020 ...
    29.02.2020 ...

    gibi degerler var. Anladık ilki 14 Şubat 2020, ikincisi 29 Şubat 2020. Peki ya bu ne?:

    3/2/2020 11:50:59
    2.03.2020 12:17:40

    Bunlar 3 Şubat 2020 ya da 2 Mart 2020 olabilir. Verinin geneline bakınca, sanki tum MM/dd/yyyy formatindekiler / kullanmış, gg.MM.yyyy ise .

    Oyle düşününce de o veri sıralı gibi duruyor. 

    Bence, bu mantıkla, try_convert kullanarak tum o veriyi yeniden güncelleyebilirsiniz, ve o kolona veri girişini durdurup, dosdoğru birisi datetime2, digeri varchar 2 kolon olarak kullanirsiniz. Bu sekilde devam edecekseniz veriniz Allah'a emanet :(



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    Haklısın abi bunu böyle yapmamak lazımdı. ama bunu datetime.now yazınca farklı pc'lerdeki aynı program bu şekilde kayıt etmiş ben böyle olacağını bilmiyordum. Şimdi yapacağım şey tarih verileri ile bu string verileri birbirinden ayırmak olacak. sonra da tarih verilerine göre sıralayabilirim. diye düşünüyorum. Ayrıca'pc'lerde tarih formatını gg/aa/yy şeklinde kayıt edebilemesi için programda güncelleme yapacam.. 

    DateTime.Now yazınca farklı PC'lerde oyle kaydetmez, o alan basından beri string bir alanmış.

    PC'lerde gg/aa/yy seklinde kayıt diye bir şey yok, hala string formatlara takılıyorsunuz :( DateTime olarak saklayın, her yerde ayni o zaman (database sevişesinde 8 bytelik bir sayi, string degil). String formatlanmis hali biz ölümlüler icin.

    Not: Indexler tablolar için genelde gerekli şeyler, ancak tekrarlıyorum, index CLUSTERED olmadıkça senin sorununu çözmez. Sorunun ORDER BY ile ilgili. Çöp ile saman karıştırıldı ne yazık ki.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    3 Mart 2020 Salı 15:52
  • Yukaridaki resimdeki tablo ne yazık ki bir felaket. Tarih ve saat bilgisi içeren degerler, öyle 'kafasına gore' string degerler olarak tutulmaz, date\datetime* gibi data tipleriyle tutulur. Oradaki veriyi parse edip, sonra da try_convert ile çevirmeyi deneyebilirsiniz ancak pek de ise yaramayacak cunku:

    2/14/2020 ...
    29.02.2020 ...

    gibi degerler var. Anladık ilki 14 Şubat 2020, ikincisi 29 Şubat 2020. Peki ya bu ne?:

    3/2/2020 11:50:59
    2.03.2020 12:17:40

    Bunlar 3 Şubat 2020 ya da 2 Mart 2020 olabilir. Verinin geneline bakınca, sanki tum MM/dd/yyyy formatindekiler / kullanmış, gg.MM.yyyy ise .

    Oyle düşününce de o veri sıralı gibi duruyor. 

    Bence, bu mantıkla, try_convert kullanarak tum o veriyi yeniden güncelleyebilirsiniz, ve o kolona veri girişini durdurup, dosdoğru birisi datetime2, digeri varchar 2 kolon olarak kullanirsiniz. Bu sekilde devam edecekseniz veriniz Allah'a emanet :(



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    Haklısın abi bunu böyle yapmamak lazımdı. ama bunu datetime.now yazınca farklı pc'lerdeki aynı program bu şekilde kayıt etmiş ben böyle olacağını bilmiyordum. Şimdi yapacağım şey tarih verileri ile bu string verileri birbirinden ayırmak olacak. sonra da tarih verilerine göre sıralayabilirim. diye düşünüyorum. Ayrıca'pc'lerde tarih formatını gg/aa/yy şeklinde kayıt edebilemesi için programda güncelleme yapacam.. 

    DateTime.Now yazınca farklı PC'lerde oyle kaydetmez, o alan basından beri string bir alanmış.

    PC'lerde gg/aa/yy seklinde kayıt diye bir şey yok, hala string formatlara takılıyorsunuz :( DateTime olarak saklayın, her yerde ayni o zaman (database sevişesinde 8 bytelik bir sayi, string degil). String formatlanmis hali biz ölümlüler icin.

    Not: Indexler tablolar için genelde gerekli şeyler, ancak tekrarlıyorum, index CLUSTERED olmadıkça senin sorununu çözmez. Sorunun ORDER BY ile ilgili. Çöp ile saman karıştırıldı ne yazık ki.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Abi dediklerinde sadece şu kısma takıldım gerisinde sorun yok,

    DateTime.Now yazınca farklı PC'lerde oyle kaydetmez

    Şimdi program aynı program evet sql'de varchar olarak tanımlıydı düzelttim orayı. sql'e zaman verisini pc'den gönderiyorum.

    Benim PC:        29.02.2020 11:31:28      olarak göndermiş,
    Başka bir PC:    2/29/2020 1:00:06 PM    olarak göndermiş.

    yani demek istediğin sql'de date olarak tanımlanan sütün bu iki farklı şekilde görünen date veriyi alıp kendi standart formatında mı kayıt ediyor?

    3 Mart 2020 Salı 16:24
  • Yani oyle de diyebilirsin, date\datetime* gibi degerler SQL server'da sayısal kaydediliyor. Oyle ay/gun, gun/ay ... envai cesit format sadece gösterim formatları, aynen C# DateTime'da olduğu gibi (biri sayi digeri struct ama demek istediğimi anlamissindir).

    Diyelimki testDB diye bir database'in ve içerisinde su yapıda bir TestTable'in var:

    id int, tarih date, tarihvesaat datetime

    Boyle bir kodu istediğin makineden calistir, hatta baska dilden, dünyanın obur ucundan calistir. Değişen tek şey calistigi makinedeki tarih ve saat olur:

    int pcNo = 1;
    using (SqlConnection cn = new SqlConnection(@"server=.\SQLExpress;Database=testDb;Trusted_connection=yes"))
    using (SqlCommand cmd = new SqlCommand(@"insert into testTable
         (id, tarih, tarihvesaat)
         values
         (@id, @t1, @t2);"), cn)
    {
       cmd.Parameters.Add("@id", SqlDbType.Int);
       cmd.Parameters.Add("@tarih", SqlDbType.Date);
       cmd.Parameters.Add("@tarihvesaat", SqlDbType.DateTime);
    
    
       cn.Open();
       for(int i=0; i < 100; i++)
       {
           cmd.Parameters["@id"].Value = pcNo * 1000 + i;
           cmd.Parameters["@tarih"].Value = DateTime.Today.AddDays(-i);
           cmd.Parameters["@tarihvesaat"].Value = DateTime.Now.AddHours(-i);
           cmd.ExecuteNonQuery();       
       }
       cn.Close();
    }

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    3 Mart 2020 Salı 16:48
  • Bu arada, ORDER BY'i bir date\datetime kolona karşı yaparsan istediğin gibi zaman sıralaması alırsın, ancak bunu string bir kolona karşı yaparsan, sıralama zamandan bagimsiz alfabetik olur. Yani:

    01/30/2020
    02/28/2000

    alfabetik siralama iken:

    02/28/2000
    01/30/2020

     date\datetime siralamasi. String bir kolonla, zaman siralamasi alabilmek icin özelim bir formatta olması lazım:

    2000/02/28
    2020/01/30

    gibi (ayraçlar, saat vs değişik sekillerde ama ortak olabilir, onemli olan ana yapı yyyyMMdd HHmmss olması - ODBC canonical format. String tutmak zorunda kalindigindaki tek guvenli format)



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    3 Mart 2020 Salı 16:54
  • Çok teşekkürler çetin abi.
    3 Mart 2020 Salı 18:39