为什么ExecuteNonQuery返回“在此上下文中输入无效”(ASP.NET | Ole Db)?

时间:2018-09-04 19:46:55

标签: c# asp.net

我想更改用户名。当前名称和新名称是文本框输入。在调试时,我得到了例外“ JOHN”在这种情况下无效。为什么会这样?它应该期望一个字符串并接收它。错误在哪里?

using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;

namespace WebApplication1
{
    public partial class Index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "...";

            OleDbCommand changeFirstName = new OleDbCommand("UPDATE Usertable SET Name =" + @NewFN + " WHERE Name = " + @FN + "", con);
            changeFirstName.Parameters.Add("@NewFN", OleDbType.VarChar).Value = getNewFirstName.Text;
            changeFirstName.Parameters.Add("@FN", OleDbType.VarChar).Value = getFirstName.Text;

            con.Open();

            try
            {
                int i = changeFirstName.ExecuteNonQuery();
            }
            catch(Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }

            con.Close();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

参数标记是SQL的一部分,位于其中:

OleDbCommand changeFirstName = new OleDbCommand(
    "UPDATE Usertable SET Name = @NewFN WHERE Name = @FN", con);

旁注:

  • 连接和命令均为IDisposable,应使用using
  • 在可能的情况下,与OleDB相比,首选特定于提供程序的提供程序-例如,如果要连接到SQL Server,请使用SqlConnection / SqlCommand
  • 您可能会在这里找到诸如“ Dapper”之类的工具,为您节省了很多工作

所有3个组合的示例:

using(var con = new SqlConnection("..."))
{
    con.Execute("UPDATE Usertable SET Name = @NewFN WHERE Name = @FN",
        new {
              NewFN = getNewFirstName.Text,
              FN = getFirstName.Text,
        });
}

答案 1 :(得分:1)

我现在明白了。因为它是OleDb,所以我不能在Command字符串中使用@。我必须使用?来代替@NewFN和@FN。在Parameter.Add上,我必须使用@Name为其提供值。这是一个示例:

OleDbCommand changeFirstName = new OleDbCommand (”UPDATE Usertable SET Name = ? WHERE Name = ?“);

changeFirstName.Parameters.Add(”@Name“, OleDbType.VarChar).Value = getNewFirstName.Text;