web-dev-qa-db-fra.com

Erreur: une chaîne ou des données binaires seraient tronquées. Les données du paramètre table-value ne sont pas conformes au type de table du paramètre

Je reçois une erreur

Chaîne ou des données binaires seront tronquées. Les données du paramètre table-value ne sont pas conformes au type de table du paramètre. L'instruction a été terminée.

La procédure stockée est:

CreatePROCEDURE [dbo].[addquestion] 
     @dt as MyDataTable readonly
AS
BEGIN
    insert into questiontbl(Question)
        select(Question) 
        from @dt;
END

Le tableau est:

CREATE TABLE [dbo].[questiontbl]
( 
  [checkval] [varchar](max) NULL, 
  [Question] [varchar](max) NULL 
) 

Code C #:

con.Close();
con.Open();

DataTable sqa = Session["questionlist"] as DataTable;

SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", sqa);                
tvparam.SqlDbType = SqlDbType.Structured;

cmd.ExecuteNonQuery();

Cmd.ExecuteNonQuery() renvoie l'erreur mentionnée. J'ai apparié le type de données - il est aussi varchar(max) en type et en table.

7
Sahebgouda Patil

J'ai référé beaucoup d'URL mais je n'ai pas eu la solution adéquate pour cela.

La principale raison de ce problème est que nous ne transmettons pas les données dans la longueur spécifiée

Mais dans notre code actuel, nous recevrons les données valides, mais la valeur ne sera pas transmise et résultera du problème mentionné.

Voici le truc,

Lors de la création de la table de données pour le paramètre table, nous devons Créer la colonne dans l’ordre que nous avons créé dans le paramètre table .

Veuillez vérifier le code suivant.

Solution (Ce qui suit fonctionnera)

C #

DataTable users= new DataTable("Users");
users.Columns.Add("EmailAddress", typeof(string));
users.Columns.Add("Content", typeof(string));

DataTable data= users.NewRow();
data["EmailAddress"] = emailAddress;
data["Content"] = content;

Sql

CREATE TYPE [dbo].[ParamEulaEmailUser] AS TABLE(
    [EmailAddress] [nvarchar](50) NOT NULL,
    [Content] [nvarchar](max) NULL
)

Ce qui suit ne fonctionnera pas

c #

DataTable users= new DataTable("Users");
users.Columns.Add("Content", typeof(string));
users.Columns.Add("EmailAddress", typeof(string));

La raison est la suivante lorsque nous envoyons des données à la procédure stockée, le paramètre table values ​​prend la valeur dans l'ordre indiqué et correspond à la colonne existante dans l'ordre. Donc, le contenu sera vérifié avec l'adresse e-mail dans la procédure stockée et génère l'erreur suivante

Erreur: une chaîne ou des données binaires seraient tronquées. Les données du paramètre table-value ne sont pas conformes au type de table du paramètre

10
Jeeva Jsb

Vous n'avez pas publié la déclaration pour le type défini par l'utilisateur MyDataTable, mais vous devez augmenter la taille de varchar de la colonne Question dans la définition de MyDataTable.

DROP TYPE [dbo].[MyDataTable]
GO

CREATE TYPE [dbo].[MyDataTable] AS TABLE
(
    [Question] [varchar](200) NULL --INCREASE THIS VALUE
)

Script un Drop et créer pour la procédure addquestion, ainsi que le type MyDataTable.

Supprimez le proc stocké, supprimez le type MyDataTable.

Editez le script MyDataTable Create comme je l’ai mentionné, exécutez-le, puis créez une partie pour le proc stocké.

1
callisto

La longueur maximale de la colonne cible est inférieure à la valeur que vous essayez d'insérer.

Cliquez avec le bouton droit sur la table dans le gestionnaire SQL et accédez à "Conception" pour visualiser la structure de votre table et les définitions de colonne. augmenter la longueur de la colonne

0
Aliasghar Bahrami