【问题标题】:Why does it say there's an error in SQL statement Insert into为什么说SQL语句Insert into有错误
【发布时间】:2017-04-06 23:45:02
【问题描述】:

我正在学习连接到 Microsoft Access 并写入数据库。我在 Access 中创建了一个数据库,并希望将数据插入其中。

 OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");

 OleDbCommand cmd = new OleDbCommand();
 string FN = textBox1.Text;
 string LN = textBox2.Text;

 cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (FN,LN)";
 cmd.Connection = conn;

 conn.Open();
 cmd.ExecuteNonQuery();

在我运行之前似乎没有错误。我运行程序,更新我的textBox1.texttextBox2.text 并按SAVE,然后我得到一个错误:

插入到 SQL 语句中的语法错误

我做错了什么??

【问题讨论】:

  • 你需要养成使用这样的参数的习惯:stackoverflow.com/questions/5893837/… 这将解决这个问题并保护你免受 SQL 注入。
  • 目前查询失败,因为 FN/LN 没有自动插入到字符串中。

标签: c# ms-access oledbconnection oledbcommand


【解决方案1】:

在您的插入中,您尝试添加值FNLN。这些值不存在于命令范围内,因此它不知道你用它做什么。您想要的是将这些值设置为参数,然后将它们及其值添加到命令中:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");
OleDbCommand cmd = new OleDbCommand();
string FN = textBox1.Text;
string LN = textBox2.Text;
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)";
cmd.Connection = conn;
cmd.Parameters.Add(new OleDbParameter("@FN", FN));
cmd.Parameters.Add(new OleDbParameter("@LN", LN));
conn.Open();
cmd.ExecuteNonQuery();

【讨论】:

  • 我认为 oledb 需要 ? 而不是 @IDENTIFIER 占位符
  • 不,如果您使用 Access,它与 @ 完美配合。重要的是保持添加到集合中的顺序与占位符的顺序相同。
  • @AlexK。这取决于驱动程序
  • 我认为它会像其他人所说的那样工作。重要的是顺序
  • 我只是想为其他用户评论:我看到很多发帖者说他们没有使用参数,因为它们更难使用。我认为这个答案表明参数与使用连接字符串一样简单,而且更安全。其实我觉得更简单!
【解决方案2】:

您的代码正在破坏,因为 FN 和 LN 是 C# 变量,您正试图将它们按原样传递给查询。这不会导致 SQL 中的语法不正确。

您需要将 FN 和 LN 作为参数传递给查询。

将您的代码更改为以下代码。

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");
OleDbCommand cmd = new OleDbCommand();
string FN = textBox1.Text;
string LN = textBox2.Text;
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)";
cmd.Parameters.Add(new OleDbParameter("@FN", FN));
cmd.Parameters.Add(new OleDbParameter("@LN", LN));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();

这应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多