Nesneleri Veritabanında Saklamak (Generic List To Database)

  • Konbuyu başlatan Konbuyu başlatan togius
  • Başlangıç tarihi Başlangıç tarihi
Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,737
Generic Listeleri Veritabanında Saklamak

MsSql Veritabanımızda Generic Listesini saklayacağımız

Bunun için MemoryStream Sınıfından yararlanacağız.

Ön hazırlıklarımız

Kod:
CREATE TABLE [dbo].[Sepetler](
	[SepetID] [int] IDENTITY(1,1) NOT NULL,
	[SepeteEkleyenID] [int] NULL,
	[SepetTarihi] [datetime] NULL,
	[SepetListesi] [varbinary](max) NULL,
 CONSTRAINT [PK_TSepetler] PRIMARY KEY CLUSTERED ([SepetID] ASC)
)

Sepetler sınıfımız

Kod:
public class Sepetler
{
    public int Adet { get; set; }
    public Urunler Urun { get; set; }
}

Urunler Sınıfımız
Kod:
public class Urunler
{
    public int UrunID { get; set; }
    public string Urun { get; set; }
    public string Resim { get; set; }
}

GetSepetler Procedure miz

Kod:
Create Procedure [dbo].[GetSepetler]
	@paramsepeteekleyenid int
As
Select * From TSepetler Where SepeteEkleyenID=@paramsepeteekleyenid


Veritabanımızın Alan adı SepetListesi varbinary(Max) türünde olsun.


Kod:
SqlCommand cmd = new SqlCommand("GetSepetler", veritabani_islemleri.Baglanti);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@paramsepeteekleyenid", SepeteEkleyenId));
        cmd.Connection.Open();
        SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        List<Sepetler> SepetListesi = new List<Sepetler>();
        while (dr.Read())
        {
            byte[] buf = (byte[])dr["SepetListesi"];
            MemoryStream memStream = new MemoryStream(buf);
            BinaryFormatter b = new BinaryFormatter();
            memStream.Position = 0;
            SepetListesi = (List<Sepetler>)b.Deserialize(memStream);            
        }
        dr.Close();

SepetListesini List<Sepetler> türünde aldık. Bunun için Tersine Serileştirme yaptık.


Peki bu List<Sepetler> sınıfını veritabanına nasıl aktaracağız. Serileştirme işlemi yapıyoruz.

SetSepetler Proceduremiz

Kod:
Create Procedure [dbo].[SetSepetler]
	@paramsepetlistesi varbinary(MAX),
	@paramsepeteekleyenid int	
As

	Insert Into TSepetler(SepetListesi,SepeteEkleyenID) Values (@paramsepetlistesi,@paramsepeteekleyenid)


Kod:
public static int InsertSepet(List<Sepetler> SepetListesi, int SepeteEkleyenId)
    {
        SqlCommand cmd = new SqlCommand("SetSepetler", veritabani_islemleri.Baglanti);
        cmd.CommandType = CommandType.StoredProcedure;
        //SepetListesini Serialize Ediyoruz.

        MemoryStream memStream = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(memStream, SepetListesi);

        cmd.Parameters.Add(new SqlParameter("@paramsepetlistesi", SqlDbType.VarBinary, Int32.MaxValue));
        cmd.Parameters["@paramsepetlistesi"].Value = memStream.GetBuffer();
        cmd.Parameters.Add(new SqlParameter("@paramsepeteekleyenid", SepeteEkleyenId));
        cmd.Connection.Open();
        int i = cmd.ExecuteNonQuery();
        cmd.Connection.Close();
        return i;
    }



Şimdi neler yaptık toparlayalım

1. Veritabanımıza varbinary(max) türünde bir alan (SepetListesi) oluşturduk
2.

Kod:
MemoryStream memStream = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(memStream, SepetListesi);

        cmd.Parameters.Add(new SqlParameter("@paramsepetlistesi", SqlDbType.VarBinary, Int32.MaxValue));
        cmd.Parameters["@paramsepetlistesi"].Value = memStream.GetBuffer();

ile SepetListesi nesnemizi veritabanına bf ile serileştirerek yolladık.

3.
Kod:
byte[] buf = (byte[])dr["SepetListesi"];
            MemoryStream memStream = new MemoryStream(buf);
            BinaryFormatter bf = new BinaryFormatter();
            memStream.Position = 0;
            SepetListesi = (List<Sepetler>)bf.Deserialize(memStream);

dr["SepetListesi"] ile ilgili kaydı byte dizisine çevirdik. ve bunu kullanarak bir memorystream oluşturduk
bf ile bu sefer tersine serileştirmeyi (List<Sepetler>) ile Generic türe çevirdik.
 
BBNET
Geri
Üst