传递给LEFT或SUBSTRING函数的长度参数无效

时间:2013-04-01 14:26:22

标签: c# tsql

我从下面得到了这个错误混乱“传递给LEFT或SUBSTRING函数的无效长度参数”。任何人都可以给我一个暗示是什么原因,以及我如何解决它?

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#代码:

string area = "AREA1,AREA2,AREA3";

using (SqlConnection conn = new SqlConnection(domain.getDecryptedSqlConnectionString(domain.name + passPhrase)))
  {
    using (SqlCommand cmd = new SqlCommand(cmdText, conn))
    {

      System.Globalization.CultureInfo cInfo = new System.Globalization.CultureInfo("pt-BR");
      DateTime dt = DateTime.Parse(startDate, cInfo);
      DateTime da = DateTime.Parse(endDate, cInfo);
      cmd.Parameters.Add("Interval", SqlDbType.Int).Value = interval;
      cmd.Parameters.Add("IntervalUnit", SqlDbType.VarChar).Value = intervalUnit;
      cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value =  dt.ToShortDateString();
      cmd.Parameters.Add("EndDate", SqlDbType.DateTime).Value = da.ToShortDateString();
      cmd.Parameters.Add("tbName", SqlDbType.VarChar).Value = domain.alarmTableName;
      cmd.Parameters.Add("AreaName", SqlDbType.VarChar).Value = area; 
      using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
      {
        using (DataTable tb = new DataTable())
        {
          try
          {
            conn.Open();
            adapter.Fill(tb);
            return tb;
          }
          catch (Exception ex)
          {
            return tb;
          }
          finally
          {
            conn.Close();
          }
        }
      }
    }
  }

已解决,我只是改变了

cmd.Parameters.Add("AreaName", SqlDbType.VarChar).Value = area;

有关

cmd.Parameters.Add("AreaName", SqlDbType.VarChar, -1).Value = area;

1 个答案:

答案 0 :(得分:0)

我可以用

重现错误
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已经是DateTime。