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 パラメータ名は、たとえばで始まる必要があり、C# コードと SQL コード@AreaNameの間で を一致させる必要があります。SqlDbType

あなたは使うべきではありません

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 に答える