簡體   English   中英

dbCommand.Append 語法錯誤,使用@parameter 將 EQUALS 轉換為 LIKE

[英]dbCommand.Append syntax error converting EQUALS to LIKE with @parameter

我有一個 .NET C# 網絡表單。 CodeBehind 將一些文本框條目提取到 append 到 select 語句用於使用的 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 命令中使用的語法更正嗎?

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

謝謝

這不是你所期望的:

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

字符串連接已關閉,將@txtLast作為標識符保留在 C# 中,而不是 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM