7
votes

En utilisant des chaînes très longues (10000+ caractères) comme valeur SQLParameter

J'essaie d'exécuter une commande insertion dans la base de données et l'une des colonnes est de type nvarchar (max). L'insertion de commande est créée à l'aide de la classe .NET SQLCommand et chacun des paramètres est représenté par un objet SQLParameter.

Ma commande est toujours exécutée, mais lorsque je passe la chaîne Quelle longueur est grande (10000 caractères de 10000+) et qui est utilisée comme valeur pour le sqlparameter mappée sur la colonne de type Nvarchar (max) après l'insertion, cette colonne particulière est laissé vide. Je répète, aucune exception n'est lancée, la commande INSERT est exécutée, mais la colonne est vide. P>

Les exemples suivants sont la façon dont j'ai essayé de créer un paramètre: p>

// message is the large string variable
// first solution
insertCommand.Parameters.Add("@message", SqlDbType.NVarChar, -1);

// second solution
insertCommand.Parameters.Add("@message", SqlDbType.NVarChar, message.Length);

// third solution
insertCommand.Parameters.Add("@message", SqlDbType.NVarChar, message.Length * 2);


1 commentaires

Définissez-vous la valeur? Tout ce que je vois, c'est que vous créez un paramètre, mais aucune valeur n'est attribuée.


5 Réponses :


1
votes

Une autre suggestion à essayer: Utilisez sqldbtype.ntext au lieu de sqldbtype.nvarchars . .


0 commentaires

0
votes

Une suggestion .. Avez-vous essayé d'utiliser sqldbtype.xml ... il n'est pas nécessaire d'analyser le XML à l'autre extrémité ... Vous pouvez simplement stocker la valeur à Varchar.


0 commentaires

5
votes

Selon MSDN

NVARCHAR:

chaîne. Un flux de longueur variable de caractères unicode allant entre 1 et 4000 caractères. La conversion implicite échoue si la chaîne est supérieure à 4 000 caractères. Définir explicitement l'objet lorsque vous travaillez avec des chaînes de plus de 4 000 caractères.

Voici Ntext:

chaîne. Un flux de longueur variable de Données Unicode avec une longueur maximale de 2 30 - 1 (ou 1 073 741 823) caractères.

Vérifiez également Ce


3 commentaires

Ntext est obsolète, de sorte que texte et image . nvarchar (max) remplace ntext


@Pierre: Nous parlons de SQLDBTYPE ( msdn.microsoft.com/en-us/Library/... ), qui est du côté du client. Ce que vous avez dit est vrai uniquement pour le serveur.


Il convient de souligner que, après avoir utilisé cette solution, SSMS peut vous tromper dans la pensée d'une chaîne vide a toujours été insérée, si vous affichez la table dans le mode "Modifier 200 lignes". Pour moi, il affichait une cellule vide lorsque la valeur était très longue, bien que les valeurs plus courtes, ce qui m'a fait penser que quelque chose ne fonctionnait toujours pas - en fait c'était en fait.



3
votes

Avez-vous essayé d'appeler addwithvalue (nom de chaîne, valeur d'objet) ?


1 commentaires

+1 Pour avoir remarqué qu'il créait un paramètre, mais ne définissant pas la valeur du paramètre.



0
votes

Avez-vous toujours le problème si vous créez explicitement SQLParameter, comme: xxx

puis ajoutez-le aux paramètres?

aussi Si vous invoquez une SPROC, Juste pour vous assurer que le paramètre Sprat est également déclaré comme Nvarchar (MAX) ou si vous n'utilisez pas de Sprat, essayez de l'utiliser. J'ai poussé des blobs varbinary (max) sans aucun problème, donc peut-être qu'un binaire obtient un meilleur traitement.


0 commentaires