1

我从下面得到这个错误消息“传递给 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;
4

1 回答 1

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,并且您必须匹配SqlDbTypeC# 代码和 SQL 代码之间的名称。

你不应该使用

cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value =  dt.ToShortDateString();

相反,它应该是

cmd.Parameters.Add("StartDate", SqlDbType.DateTime).Value =  dt;

因为dt已经是 DateTime。

于 2013-04-01T17:24:08.823 回答