2009-07-07 17 views
8

Tengo una matriz de bytes en mi clase C#, y necesito persistir en una base de datos de SQL Server 2005 utilizando NHibernate. ¿Qué tipo de datos SQL debería usar para la columna, y cómo llego a utilizar NHiberante para hacer la persistencia por mí? Si la respuesta es un tipo personalizado de NHibernate, ¿hay algún código de muestra que haga ruido para hacer esto?¿Cuál es la mejor manera de almacenar una matriz de bytes en la base de datos SQL utilizando NHibernate?

¿Sería simplemente más fácil convertir la matriz de bytes en una cadena y persistirla en una columna varcahr?

+1

¿Qué tan grande variedad somos ¿hablando sobre? Algunos cientos de bytes funcionan perfectamente con un byte [] que utiliza almacenamiento varbinary. – sisve

+0

Me he preguntado lo mismo, pero en mi caso, es mucho más grande (multi-MB), a pesar de que sé que almacenar blobs de ese tamaño está mal visto en la práctica. –

+0

Las matrices de bytes tienen una longitud de entre 2,000 y 3000 –

Respuesta

2

BinaryBlob debe generar la columna VarBinary adecuada para usted.

0

Otra forma, utilizando la columna "imagen" tipo en mssql que se asigna dinámicamente para ajustarse a archivos muy grandes como imágenes, he aquí un ejemplo.

El hbm.xml:

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

La propiedad de clase:

private byte[] _photo; 

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

la prueba, utilizando un ayudante para obtener la sesión nhibernate:

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; 
    } 
Cuestiones relacionadas