我收到错误
字符串或二进制数据将被截断。表值参数的数据不符合参数的表类型。语句已终止。
存储过程是:
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)
。
答案 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管理器中右键单击该表,然后转到“设计”以可视化表结构和列定义。增加列长