C# 传递给LEFT或SUBSTRING函数的长度参数无效
我从下面的“传递给左或子字符串函数的长度参数无效”中得到了这个错误。任何人都可以给我一个提示,这是什么原因,以及我如何解决它C# 传递给LEFT或SUBSTRING函数的长度参数无效,c#,tsql,C#,Tsql,我从下面的“传递给左或子字符串函数的长度参数无效”中得到了这个错误。任何人都可以给我一个提示,这是什么原因,以及我如何解决它 string cmdText = @"Declare @SqlString nvarchar(2500) , @AreaDelimiter char(1) , @AreaFilter nvarchar(max); Select @AreaDelimiter = ',' If (@AreaName Not Like '*') Begin Set @Area
string cmdText = @"Declare @SqlString nvarchar(2500)
, @AreaDelimiter char(1)
, @AreaFilter nvarchar(max);
Select @AreaDelimiter = ','
If (@AreaName Not Like '*')
Begin
Set @AreaName = @AreaName + @AreaDelimiter
Set @AreaFilter = ''
While LEN(@AreaName) > 0
Begin
If (Len(@AreaFilter) > 0)
Begin
Set @AreaFilter = @AreaFilter + ' Or Area Like ''' +
LTRIM(SubString(@AreaName, 1,
CharIndex(@AreaDelimiter, @AreaName) - 1)) + '%'''
End
Else
Begin
Set @AreaFilter = 'Area Like ''' +
LTRIM(SubString(@AreaName, 1,
CharIndex(@AreaDelimiter, @AreaName) - 1)) + '%'''
End
Select @AreaName = SUBSTRING(@AreaName, CharIndex(@AreaDelimiter,
@AreaName) + 1, Len(@AreaName))
End
End"
上面的代码继续执行else语句和其他操作:)
这是我的C代码:
解决了,我只是改变一下
cmd.Parameters.Add("AreaName", SqlDbType.VarChar).Value = area;
为了
我可以用计算机重现错误
DECLARE @AreaName VARCHAR(20);
DECLARE @AreaDelimiter CHAR(1);
DECLARE @AreaFilter VARCHAR(100);
SET @AreaName='AREA1,AREA2,AREA3,area4,area5';
SET @AreaDelimiter=',';
请注意,@AreaName的声明对于数据来说不够长-请检查您的声明
此外,如果@AreaName的字符串来自用户输入,则代码容易受到SQL注入攻击
编辑:
所有SQL参数名称都需要以@
开头,例如@AreaName
,并且必须在C代码和SQL代码之间匹配SqlDbType
你不应该使用
cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value = dt.ToShortDateString();
应该是这样
cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value = dt;
因为
dt
已经是日期时间。可以CharIndex(@AreaDelimiter,@AreaName)-1)
为负数吗,但是我不知道如何修复它。请您编辑您的问题,将有效的@AreaName
和@AreaDelimiter
的示例数据和无效的示例数据包括在内。我将'@AreaName'和'@AreaDelimiter'的示例值放在这里。声明@SqlString nvarchar(2500),@AreaDelimiter char(1),@AreaFilter nvarchar(最大值)
和@AreaName来自复选框我通过如下方式获得值cmd.Parameters.Add(“AreaName”,SqlDbType.VarChar)。value=area代码>@Andriusha@AreaName的声明是什么?你给其他人看了,但这就是我可以得出错误的地方。如果不给它一个长度,它默认为1。@AreaName
没有在sql上声明,我在C#code中添加了一个名为cmd的SqlCommand对象。@AreaName
的声明就是上面的命令。@Andriusha您用来添加@AreaName参数的C代码是什么?如果您使用的是.AddWithValue,是否可以尝试将其更改为.Add(“@AreaName”,SqlDbType.NVarChar,-1,yourAreaNameVariable)
?
cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value = dt.ToShortDateString();
cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value = dt;