- 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
Sepetler sınıfımız
Urunler Sınıfımız
GetSepetler Procedure miz
Veritabanımızın Alan adı SepetListesi varbinary(Max) türünde olsun.
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
Şimdi neler yaptık toparlayalım
1. Veritabanımıza varbinary(max) türünde bir alan (SepetListesi) oluşturduk
2.
ile SepetListesi nesnemizi veritabanına bf ile serileştirerek yolladık.
3.
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.
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.