Nesneleri Veritabanında Saklamak (Generic List To Database)

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,730
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.
 
Geri
Üst