【问题标题】:The multi-part identifier "System.Web.UI.HtmlControls.HtmlInputText" could not be bound [duplicate]无法绑定多部分标识符“System.Web.UI.HtmlControls.HtmlInputText”[重复]
【发布时间】:2012-03-22 02:40:11
【问题描述】:

我有一个插入 sql 语句,它使用 SqlCommand 功能来防止 sql 注入,但它给出了错误:无法绑定多部分标识符“System.Web.UI.HtmlControls.HtmlInputText”。我使用相同的 SqlCommand 功能来更新同一个表而没有问题,但是,下面这个简单的插入给出了错误。任何人都可以帮忙吗?

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ( [ds0402_key] ,[lname] ) " +
       "VALUES (" + Session["DS0402Key"] + "," + @VisitorLName + ");";

try
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn))
    {
     cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value);
     cmd.ExecuteNonQuery();
    }
}

catch (Exception ex)
{
//error handling code
}

【问题讨论】:

  • sSql 的构建方式似乎易受 SQL 注入攻击。您是否考虑过 Bobby Tables 可能是您的用户之一?
  • 除非您将每个变量值放入一个参数中,否则准备好的语句并没有多大帮助。例如,在这种情况下,您会说 VALUES(@DS0402Key, @VisitorLName),然后像使用 @VisitorLName 一样将参数 @DS0402Key 添加到命令中。

标签: c# asp.net sql-server sqlcommand


【解决方案1】:

如果确实是这段代码引发了错误,我的猜测是因为你的转义和引用都被抬高了,你最终会得到一个类似的查询

INSERT INTO [camss].[dbo].[tb_ds0402req] ( [ds0402_key] ,[lname] ) 
VALUES (whatever your key is unquoted!, System.Web.UI.HtmlControls.HtmlInputText)

(假设VisitorLNameHtmlInputText 控件)。您没有添加字符串"@VisitorLName",因为它不在引号中 - 您正在插入来自VisitorLName.ToString()的返回值...它,AFAIK,返回控件类型的完全限定名称。

(在不带引号的情况下使用@VisitorLName 时不会出错,因为@ 是C# 转义标识符的方式,因此您可以将关键字用作变量名等。就C# 而言,您刚刚说过...+ VisitorLName +... .)

还请注意,您构建 SQL 字符串的方式并没有利用参数,这是防止 SQL 注入的主要功能 - 并简化您的 SQL 构建,启动!如果您要使用参数,请将它们用于每个不是表名或其他值的值。 (对于表/数据库/模式/等名称,您只能靠自己。您不能使用参数来代替这些名称。请阅读:您再次容易受到 SQL 注入的攻击。所以除非您有,否则不要这样做!)

为了解决这个问题,改变你的代码,让它看起来像

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ( [ds0402_key] ,[lname] ) " +
       "VALUES (@DS0402Key, @VisitorLName)";

try
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn))
    {
     cmd.Parameters.AddWithValue("@DS0402Key", Session["DS0402Key"]);
     cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value);
     cmd.ExecuteNonQuery();
    }
}
catch (Exception ex)
{
//error handling code
}

此外,找到您将密钥插入会话的位置...并确保您没有插入整个控件(而不仅仅是其值)。

【讨论】:

  • 感谢您的回复,所有好的建议。我尝试添加 Session["DS0402Key"] 作为参数,当我在插入 sql 中引用它时,VS2010 给出了一个错误,它在当前上下文中不存在。我尝试在 sql 中硬编码 DS0402Key 的值以及 @VisitorLName ,但我仍然收到原始错误。
  • 我还完全删除了 DS0402Key 列,只是为了排除它可能导致问题,但我仍然收到原始错误。
  • 不只是添加的参数与上面的不同。请注意 SQL 字符串(特别是,我不是通过将东西拼凑在一起来临时构建它;我让参数完成工作)。你做事的方式,所有的引用都错了。这就是你的错误很可能来自的地方。
  • 我听到你在说什么,这是我以后会使用的一种做法,但是当我使用带有一列的插入语句时仍然会出现原始错误,如:sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ( [lname] ) VALUES (@VisitorLName)";
  • 那么我建议的更改可能没有正确进行。如果您可以将您的代码(因为它现在存在,“已修复”,但仍会中断)添加到您的答案中(添加它;不要替换那里的内容!),或者将其放入粘贴箱并链接它,我可以提供更多帮助。但在这一点上,我不得不假设错误存在于其他地方。我编写的代码应该可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2010-11-02
相关资源
最近更新 更多