我们一直在使用用户定义的表作为将不同数量的搜索条件从.Net MVC应用程序传输到存储过程的方法。
CREATE TYPE [dbo].[SearchCriteriaParametersTableType] AS TABLE
(
...
[SearchCriteriaSequence] int,
[SqlParameterStringValue] varchar(MAX),
...
)
我们最近发现了一个我无法弄清楚的错误 - 当SqlParameterStringValue是一个长字符串时,它会在501个字符后被截断。在Web应用程序端进行调试时,将在该属性中填充完整的字符串,但在Sql Profiler中查看,截断的值在insert语句中(仅显示一部分),其长度为501个字符:
declare @p1 dbo.SearchCriteriaParametersTableType
insert into @p1 values(...,N'23491,23492,23494,...,26930,26',...)
当我将列宽缩短为50,并尝试传入更长的值时,会出现截断错误。因此,似乎不是列宽度是约束,在某处传递的值被截断。
这是在一个MVC 4 Web应用程序中运行的,sql由一个新的SqlCommand访问,它有自己的连接。该数据库是Sql Server 2012。
以下是构建sql参数的方法:
var searchCriteriaParameter = new SqlParameter
{
ParameterName = parameterName,
Direction = ParameterDirection.Input,
SqlDbType = SqlDbType.Structured,
TypeName = SearchCriteriaParameterType.SearchCriteriaParameterTypeName,
Value = CriteriaParametersCollection(populatedCriteriaSummaryItems)
};
sqlParameters.Add(searchCriteriaParameter);
public SearchCriteriaCollection CriteriaParametersCollection(IEnumerable<CriteriaSummaryItem> criteriaValues)
{
var list = new SearchCriteriaCollection();
var i = 0;
foreach (var criteriaValue in criteriaValues)
{
list.Add(criteriaValue.AsSearchCriteriaParameterType(criteriaValue, i));
i++;
}
return list;
}
public SearchCriteriaParameterType AsSearchCriteriaParameterType(CriteriaSummaryItem filterItem, int i)
{
var mode = filterItem.CriteriaType;
if (!string.IsNullOrEmpty(mode) && !string.IsNullOrEmpty(TextSearchMode))
{
mode += "_" + TextSearchMode;
}
var searchCriteriaParameterType = new SearchCriteriaParameterType
{
SearchCriterionKey = filterItem.SearchCriterionKey,
SearchCriteriaSequence = i,
SqlParameterName = filterItem.SqlParameterName,
SqlParameterStringValue = filterItem.IDValues,
CriteriaSearchMode = mode
};
return searchCriteriaParameterType;
}
任何想法在哪里看?
答案 0 :(得分:2)
这很可能是由于SqlMetaData
中该字段的SqlDataRecord
的定义方式。代码的那部分(即SearchCriteriaCollection
的定义)未显示,但我可以说您需要为Size
设置SqlMetaData
的{{1}}属性< em>和它应该是SqlParameterStringValue
。例如:
SqlMetaData.Max