为什么执行非查询会返回"Input is not valid in this context" (ASP.NET |Ole Db)?



我想更改用户名。当前名称和新名称和新名称是文本框输入。在调试时,我得到异常,即 f.e. "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();
}
}
}

参数令牌是 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,
});
}

我现在明白了。因为它是 OleDb 所以我不能在命令字符串中使用 @。而不是@NewFN和@FN我必须使用?。在 Parameter.Add 上,我必须使用 @Name 给它们一个值。下面是一个示例:

OleDbCommand changeFirstName = new OleDbCommand (”UPDATE Usertable SET Name = ? WHERE Name = ?“);
changeFirstName.Parameters.Add(”@Name“, OleDbType.VarChar).Value = getNewFirstName.Text;

相关内容

最新更新