我有一个.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 + "%");
谢谢你
这不是你所期望的
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);
}