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;