我从下面得到了这个错误混乱“传递给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;
答案 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。