![](/img/trans.png)
[英]DbCommand Insert error The syntax of the query near identifier 'INTO'
[英]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.