dbCommand.Append语法错误,用@参数将EQUALS转换为LIKE。

问题描述 投票:0回答:1

我有一个.NET C# webform。CodeBehind拾取了一些文本框条目,以附加到用于txtboxes的选择语句中。下面是ASP文本框。

<asp:TextBox ID="txtBadge" runat="server" CssClass="txtBadgeStyle"></asp:TextBox>    
<asp:TextBox ID="txtFirst" runat="server" CssClass="txtFirstStyle"></asp:TextBox>
<asp:TextBox ID="txtLast" runat="server" CssClass="txtLastStyle"></asp:TextBox>

这是服务器端的(当前错误版本)。

StringBuilder sbCommand = new StringBuilder("SELECT a.BADGE_ID, a.FIRSTNAME, a.LASTNAME, a.TITLE, b.deptname, CASE WHEN a.ACTIVE=1 THEN 'Yes' ELSE 'No' END FROM XA_EMPMAS a left join dept_master b on b.deptnum = a.deptnum where 1 = 1");

if (string.IsNullOrEmpty(txtBadge.Text) == false)
{
    sbCommand.Append(" AND a.BADGE_ID=@txtBadge");
    SqlParameter param = new SqlParameter("@txtBadge", txtBadge.Text);
    cmd.Parameters.Add(param);
}

if (string.IsNullOrEmpty(txtFirst.Text) == false)
{
    sbCommand.Append(" AND a.FIRSTNAME=@txtFirst");
    SqlParameter param = new SqlParameter("@txtFirst", txtFirst.Text);
    cmd.Parameters.Add(param);
}

if (string.IsNullOrEmpty(txtLast.Text) == false)
{
    sbCommand.Append(" AND a.LASTNAME like " + @txtLast + "%");
    SqlParameter param = new SqlParameter("@txtLast", txtLast.Text);
    cmd.Parameters.Add(param);
}

所以我想把名字和姓氏的附加值转换为LIKE而不是EQUALS。先不说firstname,我一直在用lastname瞎折腾,也没有成功。

谁能给我纠正一下在append命令中使用like的语法?

sbCommand.Append(" AND a.LASTNAME like " + @txtLast + "%");

谢谢你

c# asp.net sql-like
1个回答
1
投票

这不是你所期望的

sbCommand.Append(" AND a.LASTNAME like " + @txtLast + "%");

字符串连接被关闭了,剩下的是 @txtLast 作为C#中的标识符,而不是SQL的一部分。而不是SQL的一部分。@ 字符是C#中用于在标识符可能与关键字相匹配的情况下,给标识符加上前缀。您有一个名为 txtLast,使这段代码通过隐式转换为字符串而合法。

因此,如果它甚至编译了所产生的 LIKE 语句在SQL中可能是不合法的。你可能在SQL中最后会出现这样的条件。

AND a.LaSTNAME like System.Web.UI.WebControls.Textbox%

除了类型名而不是文本值之外,还缺少必要的单引号。

你可能想要的是这样的。

sbCommand.Append(" AND a.LASTNAME like @txtLast + '%'");

或者这个

sbCommand.Append(" AND a.LASTNAME like @txtLast");
SqlParameter param = new SqlParameter("@txtLast", txtLast.Text + "%");

此外,你应该考虑为你的参数提供所有的类型信息。如果你不这样做,ADO.Net就只能猜测类型和长度。它倾向于假设NVARCHAR和50(或文本的确切长度)。当这些假设中的任何一个出错时,都会造成很大的性能问题,比如强制索引缺失(这可能是巨大的),或者表中每行的转换(这也可能是巨大的)。

if (!string.IsNullOrEmpty(txtLast.Text))
{
    sbCommand.Append(" AND a.LASTNAME like @txtLast + '%'");
    SqlParameter param = new SqlParameter("@txtLast", SqlDbtype.NVarChar, 50);
    param.Value = txtLast.Text;
    cmd.Parameters.Add(param);
}

或者,更短。

if (!string.IsNullOrEmpty(txtLast.Text))
{
    sbCommand.Append(" AND a.LASTNAME like @txtLast + '%'");
    cmd.Parameters.Add("@txtLast", SqlDbType.NVarChar, 50).Value = txtLast.Text;
}

特别是对于数字和日期来说,这可能是很重要的。我会写成 Badge_ID 这样的部分。

if (!string.IsNullOrEmpty(txtBadge.Text))
{
    sbCommand.Append(" AND a.BADGE_ID=@txtBadge");
    cmd.Parameters.Add("@txtBadge", SqlDbtype.Int).Value = int.Parse(txtBadge.Text);
}
© www.soinside.com 2019 - 2024. All rights reserved.