2008-10-21 4 views
9

Système Web VB.net avec un backend SQL Server 2005. J'ai une procédure stockée qui retourne un varchar, et nous obtenons finalement des valeurs qui ne rentre pas dans un varchar (8000).Puis-je retourner un varchar (max) à partir d'une procédure stockée?

J'ai changé le paramètre de retour en un varchar (max), mais comment puis-je dire à la propriété OleDbParameter.Size d'accepter n'importe quelle quantité de texte?

Comme exemple concret, le code VB qui a obtenu le paramètre de retour de la procédure stockée utilisée pour ressembler à:

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

Que puis-je faire .Size de travailler avec un (max)?

Mise à jour:

Pour répondre à quelques questions:

Pour toutes fins utiles, ce texte tous les besoins à venir comme un morceau. (Changer cela prendrait plus de travail structurel que je veux faire - ou suis autorisé pour, vraiment.)

Si je ne définis pas une taille, j'obtiens une erreur en lisant "String [6]: la propriété Size a une taille invalide de 0. "

Répondre

8

upvoted Ed Altofer. (Il a répondu en premier, alors si vous aimez ma réponse, votez aussi).

OleDb est votre problème. Il s'agit d'une connexion de base de données générique qui nécessite de parler à plus que SQL Server. Par conséquent, vous avez le plus petit dénominateur commun: seul le jeu de fonctionnalités composites le plus faible peut être entièrement pris en charge. L'une des fonctionnalités perdues est le support de varchar (max).

Vous utilisez SQL Server 2005 et VB.Net. Qu'est-ce qui vous empêche d'utiliser System.Data.SqlClient plutôt que System.Data.OleDb?

Modifier
J'ai trouvé la documentation sur le problème. Voir ici:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

La partie pertinente:

Valeurs de retour de type de données varchar (max), nvarchar (max), varbinary (max), xml, UDT, ou tout autre objet de grande taille Les types ne peuvent pas être renvoyés aux versions du client antérieures à SQL Server 2005. Si vous souhaitez utiliser ces types comme valeurs de retour, vous devez utiliser SQL Server Native Client.

+1

Franchement - mon patron. Tout le système est construit sur la connexion OleDB, et je dois vivre avec. Croyez-moi, si j'architurais ça, je serais sur la meilleure version. (Bien sûr, si j'étais responsable, le sproc que j'essayais de réparer n'existerait même pas ...) –

0

À quoi ressemble cette grande chaîne? Est-ce que c'est peut-être quelque chose qui pourrait être mieux retourné à travers un ensemble d'enregistrements supplémentaires, ou est-ce seulement un texte de note?

1

Avez-vous essayé de ne pas spécifier la taille?
Pourriez-vous retourner un texte au lieu d'un VARCHAR (MAX)?

+0

Si vous ne spécifiez pas une taille, une erreur différente se produit. Renvoyer du texte échoue pour plusieurs raisons: il est obsolète, SQL2005 ne semble pas vouloir transtyper entre varchar et le texte, et il est contraire à la stratégie CORP d'utiliser des TEXTs. –

8

Pouvez-vous utiliser ADO.NET? Pour clarifier, je suggère juste que vous pourriez vouloir considérer ADO.NET puisque vous travaillez avec VB.NET 2005 et SQL Server 2005 - OLEDB était le moyen d'accès pré-NET. bases de données, vous pouvez donc trouver plus de flexibilité en utilisant ADO.NET à la place.

Vous ne devez pas retourner VARCHARs à partir d'une procédure stockée. Je ne suis même pas sûr que tu le puisses. Toutefois, si vous utilisez un paramètre OUT, vous ne devriez pas avoir à le spécifier par taille. Par exemple:

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

Vous ne savez pas si cela répond à vos besoins, mais cela devrait fonctionner correctement.

+0

OleDb ne prend en charge que jusqu'à varchar (8000), c'est donc exactement la cause du problème. –

+0

Joel - vous avez certainement pris une limitation de OleDb que je ne connaissais pas. Très bon point. –

0

Avez-vous essayé de préciser:

objOutParam1.Size = Int32.MaxValue; 
+0

Oui. Le type de retour varchar spécifié dans le constructeur du paramètre limite la valeur de retour aux 8000 premiers caractères.Il ne semble pas y avoir de type de retour varchar (max). (?) –

-1

La réponse courte est d'utiliser TEXT au lieu de VARCHAR (max). 8 Ko est la taille maximale d'une page de base de données, où toutes vos colonnes de données doivent être insérées, sauf BLOB et TEXT. Cela signifie que votre capacité disponible est inférieure à 8k à cause de vos autres colonnes. BLOB et TEXT est ainsi Web 1.0. Des lignes plus grandes signifient une plus grande durée de réplication de la base de données et des E/S plus importantes. Je vous suggère de maintenir un serveur de fichiers séparé avec une interface HTTP pour cela.

Et, pour la colonne précédente

dataURL VARCHAR (255) NOT NULL,

Lors de l'insertion d'une nouvelle ligne, on calcule d'abord la somme de contrôle MD5 des données. Deuxièmement, téléchargez les données sur le serveur de fichiers avec la somme de contrôle comme nom de fichier. Troisièmement, INSERT INTO ... (..., DataUrl) VALEURS (..., "http://fileserver/get?id=". Md5_checksum_data)

Avec ce design, votre base de données restera calme même si la taille moyenne des données devient 1000x. Il suffit d'utiliser int.MaxValue pour la taille du paramètre

+0

C'est complètement faux. varchar (max) est stocké en dehors de la ligne si les données sont suffisamment longues. – erikkallen

+0

Doit également mentionner que les types de données TEXT et IMAGE sont obsolètes. Il n'existe pas de BLOB dans SQL Server (appelé Image ou varbinary (max)). – erikkallen

+0

TEXT est obsolète dans SQL Server 2005? Je ne le savais pas. Pouvez-vous partager la source? – yogman

0

L'octet [] du sproc aura la bonne longueur. (J'utilise effectivement varbinary mais les résultats seront les mêmes).

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

Avez-vous essayé avec « OleDbType.LongVarChar », cette carte de type au texte dans SQL Server 2K, et vous permet de récupérer plus de 8K caractères.

4

Je pense que l'utilisation de -1 pour la taille fonctionnerait. Au moins, il devrait avec ADO.NET. Comme ceci:

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

C'est un long article, mais il montre en utilisant -1 dans le dernier exemple:

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

0

L'option -1 fonctionne assez bien. Je l'utilise dans plusieurs cas où j'ai un retour varchar (max) à partir d'un proc stocké.

Questions connexes