2009-07-07 18 views
8

C# sınıfımda bir dizi baytım var ve NHibernate kullanarak bir SQL Server 2005 veritabanına devam etmem gerekiyor. Sütun için hangi SQL veri türünü kullanmalıyım ve benim için sürekliliği yerine getirmek için NHiberante'yi nasıl kullanmalıyım? Cevap, özel bir NHibernate türü ise, bunu yapmak için etrafında dolanan örnek bir kod var mı?NHibernate kullanarak SQL veritabanında bayt dizisini depolamanın en iyi yolu nedir?

Bayt dizisini bir dizeye dönüştürmek ve bir varcahr sütununda kalması daha kolay olur mu?

+1

vardır hakkında konuşmak? Birkaç yüz bayt, varbinary depolama kullanarak bir bayt [] ile mükemmel şekilde çalışır. – sisve

+0

Ben de aynı şeyi merak ettim, ama benim durumumda, çok daha büyük (multi-MB) - uygulamada büyüklüğünün çatlamış olduğu blobları depoladığımı bilmeme rağmen. –

+0

Bayt dizilerinin uzunluğu yaklaşık 2.000-3.000'dir. –

cevap

2

BinaryBlob sizin için uygun VarBinary sütununu oluşturmalıdır.

0

Başka bir şekilde, resim gibi çok büyük dosyaları sığdırmak için mssql içinde "image" sütun tipi sütununu kullanarak başka bir yol, işte bir örnek.

hbm.xml:

<property name="Photo" column="Photo" type="BinaryBlob" not-null="true"></property> 

sınıf özelliği:

private byte[] _photo; 

public virtual byte[] Photo 
{ 
    get { return _photo; } 
    set { _photo = value; } 
} 

Testi, nhibernate oturumu almak için bir yardımcı kullanarak: ne kadar büyük dizi biz

Image image = Image.FromFile(@"C:\Documents and Settings\someuser\Desktop\logoTop.gif"); 
    byte[] imageByte; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
    image.Save(ms, ImageFormat.Gif); 
    imageByte = ms.ToArray(); 
    } 

    NHSession sessionManager = new NHSession(); 
    using (ISession session = sessionManager.GetSession()) 
    using (ITransaction tx = session.BeginTransaction()) 
    try 
    { 
     MyPhoto photo = new MyPhoto(); 
     photo.Photo = imageByte; 
     session.Save(photo); 
     session.Refresh(photo); 
     Console.WriteLine(photo.EverifyPhotoId); 
     tx.Commit(); 
    } 
    catch (HibernateException) 
    { 
     if (tx.IsActive) 
     tx.Rollback(); 
     throw; 
    } 
İlgili konular