none
Asp.net SQL ile Tabloya Sadece 10 Kayıt Eklemek İstiyorum ? RRS feed

  • Soru

  • iyi günler microsoft ailesi ben sql veritabanındaki tabloya sadece 10 kayıt eklemek istiyorum yeni ekledikçe eski 1 tane silinecek binevi log tutma gibi yapacağım
    28 Nisan 2016 Perşembe 09:50

Yanıtlar

  • FIFO kuralına göre silin. Log gibi bir şey diyorsunuz o zaman bir datetime alanı da olacak demektir. Min (minimum) fonksiyonunu kullanarak en eski tarihli kayıdı silebilirsiniz veya tarihe göre sıralayıp en küçüğü silebilirsiniz. vb. 5 kayıt ekleyecekseniz top 5 diyerek 5 kaydı alıp bunları silebilirsiniz. 



    http://pgnchess.com
    http://dergikapaklari.com

    • Yanıt Olarak İşaretleyen Mahmut Fdn 28 Nisan 2016 Perşembe 14:00
    28 Nisan 2016 Perşembe 10:35
  • Sql veritabani dediginiz nedir? PostgreSQL mi? MS SQL server mi? NoSQL olsaydi, ornegin MongoDb ile dogrudan bir Capped Collection yapip kapasitesini 10 olarak belirtirdin olur biterdi.

    PostgreSQL'de serial ve NextVal() var. Onunla rahatlikla yaparsin. Bu forumda insanlar genelde, her nedense, MS SQL server diyeceklerine SQL diyorlar. Sanirim sen de MS SQL server demek istiyorsun. MS SQL server'da da artik SEQUENCE var ve PostgreSQL'in Serial'ini taklit ediyor, onunla yapabilirsin. Ornegin:

    CREATE SEQUENCE CappedCollection 
     START WITH 1 
     INCREMENT BY 1
     MINVALUE 1
     MAXVALUE 10
     CYCLE;
    
    
    CREATE TABLE CappedLog (logId INT, logged DATETIME2 null, data VARCHAR(100));
    INSERT INTO dbo.CappedLog ( logId )
    SELECT TOP 10 ROW_NUMBER() OVER (ORDER BY id) FROM sys.syscolumns;
    

    Seklinde SQL server'da bir Sequence ve CappedLog adinda yukaridaki tabloyu yaratip, icini bastan 10 adet satirla doldurursak, bundan sonra sadece UPDATE komutu ile istenileni yapabiliriz:

    void Main()
    {
    	using (var con = new SqlConnection(@"server=.\SQLExpress2012;Database=test;Trusted_Connection=yes;"))
    	{
    	   var sql = @"DECLARE @nextId INT = NEXT VALUE FOR CappedCollection;
    		UPDATE CappedLog  
    			SET logged = @tarih, data = @data
    			WHERE logId = @nextId;";
    			
    		// 123 defa log'a birseyler "insert" edelim
    		var cmd = new SqlCommand( sql, con);
    		cmd.Parameters.AddWithValue("@tarih", DateTime.Now);
    		cmd.Parameters.AddWithValue("@data", "");
    		
    		con.Open();
    		for (int i = 1; i <= 123; i++)
    		{
    			cmd.Parameters["@tarih"].Value = DateTime.Now.AddHours(-150).AddHours(i); // Ornek insert zamani
    			cmd.Parameters["@data"].Value = "Log #" + i;
    			cmd.ExecuteNonQuery();
    		}
    		
    		// tabloyu kontrol edelim
    		var reader = new SqlCommand("select * from CappedLog", con).ExecuteReader();
    		while (reader.Read())
    		{
    			Console.WriteLine("{0}, {1}, {2}", (int)reader["logId"], (DateTime)reader["Logged"], (string)reader["Data"]);
    		}
    		con.Close();
    	}
    }
    

    Ciktisi:

    1, 4/27/2016 11:35:16 AM, Log #121
    2, 4/27/2016 12:35:16 PM, Log #122
    3, 4/27/2016 1:35:16 PM, Log #123
    4, 4/27/2016 4:35:16 AM, Log #114
    5, 4/27/2016 5:35:16 AM, Log #115
    6, 4/27/2016 6:35:16 AM, Log #116
    7, 4/27/2016 7:35:16 AM, Log #117
    8, 4/27/2016 8:35:16 AM, Log #118
    9, 4/27/2016 9:35:16 AM, Log #119
    10, 4/27/2016 10:35:16 AM, Log #120

    • Yanıt Olarak İşaretleyen Mahmut Fdn 28 Nisan 2016 Perşembe 14:00
    28 Nisan 2016 Perşembe 13:36
    Yanıtlayıcı

Tüm Yanıtlar

  • FIFO kuralına göre silin. Log gibi bir şey diyorsunuz o zaman bir datetime alanı da olacak demektir. Min (minimum) fonksiyonunu kullanarak en eski tarihli kayıdı silebilirsiniz veya tarihe göre sıralayıp en küçüğü silebilirsiniz. vb. 5 kayıt ekleyecekseniz top 5 diyerek 5 kaydı alıp bunları silebilirsiniz. 



    http://pgnchess.com
    http://dergikapaklari.com

    • Yanıt Olarak İşaretleyen Mahmut Fdn 28 Nisan 2016 Perşembe 14:00
    28 Nisan 2016 Perşembe 10:35
  • Sql veritabani dediginiz nedir? PostgreSQL mi? MS SQL server mi? NoSQL olsaydi, ornegin MongoDb ile dogrudan bir Capped Collection yapip kapasitesini 10 olarak belirtirdin olur biterdi.

    PostgreSQL'de serial ve NextVal() var. Onunla rahatlikla yaparsin. Bu forumda insanlar genelde, her nedense, MS SQL server diyeceklerine SQL diyorlar. Sanirim sen de MS SQL server demek istiyorsun. MS SQL server'da da artik SEQUENCE var ve PostgreSQL'in Serial'ini taklit ediyor, onunla yapabilirsin. Ornegin:

    CREATE SEQUENCE CappedCollection 
     START WITH 1 
     INCREMENT BY 1
     MINVALUE 1
     MAXVALUE 10
     CYCLE;
    
    
    CREATE TABLE CappedLog (logId INT, logged DATETIME2 null, data VARCHAR(100));
    INSERT INTO dbo.CappedLog ( logId )
    SELECT TOP 10 ROW_NUMBER() OVER (ORDER BY id) FROM sys.syscolumns;
    

    Seklinde SQL server'da bir Sequence ve CappedLog adinda yukaridaki tabloyu yaratip, icini bastan 10 adet satirla doldurursak, bundan sonra sadece UPDATE komutu ile istenileni yapabiliriz:

    void Main()
    {
    	using (var con = new SqlConnection(@"server=.\SQLExpress2012;Database=test;Trusted_Connection=yes;"))
    	{
    	   var sql = @"DECLARE @nextId INT = NEXT VALUE FOR CappedCollection;
    		UPDATE CappedLog  
    			SET logged = @tarih, data = @data
    			WHERE logId = @nextId;";
    			
    		// 123 defa log'a birseyler "insert" edelim
    		var cmd = new SqlCommand( sql, con);
    		cmd.Parameters.AddWithValue("@tarih", DateTime.Now);
    		cmd.Parameters.AddWithValue("@data", "");
    		
    		con.Open();
    		for (int i = 1; i <= 123; i++)
    		{
    			cmd.Parameters["@tarih"].Value = DateTime.Now.AddHours(-150).AddHours(i); // Ornek insert zamani
    			cmd.Parameters["@data"].Value = "Log #" + i;
    			cmd.ExecuteNonQuery();
    		}
    		
    		// tabloyu kontrol edelim
    		var reader = new SqlCommand("select * from CappedLog", con).ExecuteReader();
    		while (reader.Read())
    		{
    			Console.WriteLine("{0}, {1}, {2}", (int)reader["logId"], (DateTime)reader["Logged"], (string)reader["Data"]);
    		}
    		con.Close();
    	}
    }
    

    Ciktisi:

    1, 4/27/2016 11:35:16 AM, Log #121
    2, 4/27/2016 12:35:16 PM, Log #122
    3, 4/27/2016 1:35:16 PM, Log #123
    4, 4/27/2016 4:35:16 AM, Log #114
    5, 4/27/2016 5:35:16 AM, Log #115
    6, 4/27/2016 6:35:16 AM, Log #116
    7, 4/27/2016 7:35:16 AM, Log #117
    8, 4/27/2016 8:35:16 AM, Log #118
    9, 4/27/2016 9:35:16 AM, Log #119
    10, 4/27/2016 10:35:16 AM, Log #120

    • Yanıt Olarak İşaretleyen Mahmut Fdn 28 Nisan 2016 Perşembe 14:00
    28 Nisan 2016 Perşembe 13:36
    Yanıtlayıcı
  • Teşekkür Ederim bilgi verdiğiniz için
    28 Nisan 2016 Perşembe 13:58
  • Teşekkür Ederim bilginiz için
    28 Nisan 2016 Perşembe 14:00