错误:字符串或二进制数据将被截断。表值参数的数据不符合参数的表类型

时间:2016-03-28 06:55:20

标签: c# asp.net .net sql-server ado.net

我收到错误

  

字符串或二进制数据将被截断。表值参数的数据不符合参数的表类型。语句已终止。

存储过程是:

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

表格是:

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

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()返回提到的错误。我匹配了数据类型 - 它在类型和表格中也是varchar(max)

3 个答案:

答案 0 :(得分:11)

我已经提到了许多网址,但没有得到适当的解决方案。

  

这个问题的主要原因是,我们没有传递数据   指定长度

但是在我们的实际代码中,我们将发送有效数据,但该值不会被传递并将通过上述问题。

这里的诀窍是,

  

在为表值参数创建数据表时,我们需要   按照我们在表值中创建的顺序创建列   参数。

请检查以下代码。

解决方案(以下方法可行)

<强> 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
)

以下内容不起作用

<强> c#中

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

原因是在我们向存储过程发送数据时,表值参数采用给定顺序的值并与顺序中的现有列匹配。因此,将使用存储过程中的电子邮件地址检查内容,并抛出以下错误

错误:字符串或二进制数据将被截断。表值参数的数据不符合参数的表类型

答案 1 :(得分:1)

您尚未发布MyDataTable用户定义类型的声明,但您应该在MyDataTable定义中增加Question列的varchar大小。

DROP TYPE [dbo].[MyDataTable]
GO

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

为addquestion过程编写Drop and Create脚本,以及MyDataTable类型。

删除存储过程,删除MyDataTable类型。

按照我的提法编辑MyDataTable Create脚本,然后运行它,然后为存储过程创建部分。

答案 2 :(得分:0)

目标列的最大长度小于您尝试插入的值。

在SQL管理器中右键单击该表,然后转到“设计”以可视化表结构和列定义。增加列长