domingo, 12 de junio de 2011

NText en Sql Server Ce 4.0

Hoy me han preguntado en el blog como poder grabar un texto de más de 4000 caracteres en una base de datos Sql Server Ce 4.0.

Como me dice el autor del comentario, no tenemos disponible el tipo de datos nvarchar(max), así que la única solución que veo es declarar el campo ntext (que aunque después podría darnos guerra, por lo menos podremos grabar nuestra “super-cadena” de más de 4000 caracteres…)

Pues bien, tengo buenas y malas noticias.

Las malas son que utilizando System.Data.Common (factoría de proveedores) yo no encuentro como hacerlo, es decir, la equivalencia del tipo ntext de CE es System.Data.DbType.String si estamos trabajando con System.Data.Common. Y en este caso, el tamaño máximo de la cadena asignada es 4000. Si intentamos poner una cadena de tamaño superior, no falla pero trunca el valor al grabarlo en la base de datos. De hecho, aquí hay alguien que pregunta por esto mismo, pero como la solución (si es que la hay) está colgada en experts-exchange.com y es de pago, pues me voy a quedar con las ganas y voy a posponer este problema, rezando porque ningún cliente tenga la necesidad de grabar más de 4000 caracteres en las aplicaciones que nos piden en la empresa ;-)

Las buenas noticias son que si utilizamos el proveedor nativo de CE (en vez de la factoría de proveedores) y un SqlCeParameter, sí que podremos grabar más de 4000 caracteres en un campo de tipo ntext.

Por ejemplo, tengo en mi disco un fichero LIBRO.TXT (que literalmente tiene dentro un libro con “chorrocientos mil” caracteres) y no hay problema en guardarlo de este modo…

        Dim cnn As New System.Data.SqlServerCe.SqlCeConnection

        cnn.ConnectionString = "Data Source=|DataDirectory|\MIDB.sdf"

        cnn.Open()

        Dim cmd As New System.Data.SqlServerCe.SqlCeCommand

        cmd.CommandText = "UPDATE Ficheros SET Comentario = @Comentario"

        Dim prm As New System.Data.SqlServerCe.SqlCeParameter

        prm.ParameterName = "@Comentario"

        prm.SqlDbType = Data.SqlDbType.NText

        prm.Value = System.IO.File.ReadAllText("C:\LIBRO.txt")

        cmd.Parameters.Add(prm)

        cmd.Connection = cnn

        cmd.ExecuteNonQuery()

        cmd.Dispose()

        cnn.Dispose()

 

Espero haber contestado con esto a la pregunta del blog, pero en cualquier caso es otro tip a sumar a esa gran decisión de ¿Sql Server CE 4.0 en ASP.NET Sí o No?

Un saludo!.

No hay comentarios:

Publicar un comentario