2008-10-21 30 views
9

Sistema web VB.net con un servidor SQL Server 2005. Tengo un procedimiento almacenado que devuelve un varchar, y finalmente estamos obteniendo valores que no caben en un varchar (8000).¿Puedo devolver un varchar (max) de un procedimiento almacenado?

He cambiado el parámetro de retorno a un varchar (max), pero ¿cómo le digo la Propiedad OleDbParameter.Size a aceptar cualquier cantidad de texto?

Como ejemplo concreto, el código VB que consiguió el parámetro de retorno del procedimiento almacenado utilizado para parecerse a:

objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar) 
objOutParam1.Size = 8000 
objOutParam1.Direction = ParameterDirection.Output 

Qué puedo hacer Clasifique a trabajar con un (max)?

Actualización:

para responder a algunas preguntas:

Para todos los efectos, este texto todas las necesidades para salir como un trozo. (Cambiar eso requeriría más trabajo estructural de lo que quiero hacer, o estoy autorizado, en realidad.)

Si no configuro un tamaño, aparece un error que dice "Cadena [6]: la propiedad Tamaño tiene un tamaño inválido de 0. "

Respuesta

8

upvoted Ed Altofer. (Él respondió primero, así que si te gusta mi respuesta, también la vota).

OleDb es su problema. Es una conexión de base de datos genérica que necesita hablar más allá de SQL Server y, como resultado, tiene una situación de denominador común mínimo donde solo se admite completamente el conjunto de características compuestas más débiles. Una de las características perdidas es el soporte varchar (max).

Usted está utilizando SQL Server 2005 y VB.Net. ¿Qué le impide usar System.Data.SqlClient en lugar de System.Data.OleDb?

Editar
Encontré la documentación del problema. Ver aquí:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

La parte pertinente:

valores de retorno de tipo de datos varchar (max), nvarchar (max), varbinary (max), xml, UDT, u otro objeto grande los tipos no pueden devolverse a las versiones del cliente antes que SQL Server 2005. Si desea utilizar estos tipos como valores devueltos, debe usar SQL Server Native Client.

+1

Francamente, mi jefe. Todo el sistema está construido sobre la conexión OleDB, y tengo que vivir con eso. Créeme, si estuviera diseñando esto, estaría en la mejor versión. (Por supuesto, si yo estuviera a cargo, el sproc que estaba tratando de arreglar ni siquiera existiría ...) –

0

¿Cómo es esta cadena grande? ¿Es quizás algo que podría devolverse mejor a través de un conjunto de registros adicional, o es solo texto de notas?

1

¿No han intentado especificar el tamaño?
¿Podría devolver un TEXTO en lugar de un VARCHAR (MAX)?

+0

Al no especificar un tamaño, se arroja un error diferente. La devolución de texto falla por un par de razones: está en desuso, SQL2005 no parece querer transmitir entre varchar y texto, y está en contra de la política de corp utilizar TEXT. –

8

¿Se puede usar ADO.NET?

Editar: Para aclarar, sólo estoy sugiriendo que es posible que desee considerar ADO.NET ya que se trabaja con VB.NET 2005 y SQL Server 2005 - OLEDB era la manera de acceder a pre-.NET bases de datos, por lo que puede encontrar más flexibilidad mediante el uso de ADO.NET en su lugar.

No debe volver VARCHAR de un procedimiento almacenado. Ni siquiera estoy seguro de que puedas.

Sin embargo, si se utiliza un parámetro OUT, no debería tener que especificar que por tamaño. Por ejemplo:

SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar); 
p.Direction = ParameterDirection.Output; 

No estoy seguro si esto se adaptará a sus necesidades, pero debería funcionar bien.

+0

OleDb solo admite hasta varchar (8000), por lo que esta es exactamente la causa del problema. –

+0

Joel - definitivamente captó una limitación de OleDb que yo no conocía. Muy buen punto. –

0

Ha intentado especificando:

objOutParam1.Size = Int32.MaxValue; 
+0

Sí. El tipo de retorno varchar especificado en el constructor del parámetro limita el valor de retorno a los primeros 8000 caracteres.No parece haber un tipo de devolución varchar (max). (?) –

-1

La respuesta corta es usar TEXTO en lugar de VARCHAR (max). 8K es el tamaño máximo de una página de base de datos, donde todas sus columnas de datos deberían coincidir, excepto BLOB y TEXT. Es decir, su capacidad disponible es inferior a 8 k debido a sus otras columnas.

BLOB y TEXT es tan Web 1.0. Las filas más grandes significan un mayor tiempo de replicación de la base de datos y una mayor E/S de archivos. Sugiero que mantenga un servidor de archivos por separado con una interfaz HTTP para eso.

Y, por la columna anterior

DataURL VARCHAR (255) NOT NULL,

Al insertar una nueva fila, primero calcular la suma de comprobación MD5 de los datos. En segundo lugar, cargue los datos en el servidor de archivos con la suma de comprobación como nombre de archivo. En tercer lugar, INSERT INTO ... (...,) VALUES (DataURL ... "http://fileserver/get?id=". Md5_checksum_data)

Con este diseño, la base de datos va a mantener la calma, incluso si el tamaño medio de los datos se convierte en 1000x.

+0

Esto es completamente incorrecto. varchar (max) se almacena fuera de la fila si los datos son lo suficientemente largos. – erikkallen

+0

También debería mencionar que los tipos de datos TEXTO e IMAGEN están en desuso. No existe un BLOB en SQL Server (se llama Image o varbinary (max)). – erikkallen

+0

TEXT está en desuso en SQL Server 2005? No lo sabía. ¿Puedes compartir la fuente? – yogman

0

Simplemente use int.MaxValue para el tamaño del parámetro. El byte [] fuera del sproc tendrá la longitud correcta. (Estoy usando activamente varbinary pero los resultados serán los mismos).

param.Size = int.MaxValue; 
param.SqlDbType = SqlDbType.VarBinary; 
0

Ha intentado con "OleDbType.LongVarChar", este tipo de mapas de texto en el servidor SQL 2K, y le permite recuperar más de 8K caracteres.

4

Creo que usar -1 para el tamaño funcionaría. Al menos debería con ADO.NET. De esta manera:

objOutParam1 = objCommand.Parameters.Add ("@ RStr", OleDbType.varchar, -1)

Este es un artículo largo, pero se muestra el uso de -1 en el último ejemplo:

http://msdn.microsoft.com/en-us/library/bb399384.aspx

0

La opción -1 funciona bastante bien. Lo uso en varios casos en los que tengo un retorno varchar (máximo) desde un proceso almacenado.

Cuestiones relacionadas