【问题标题】:Syntax error in INSERT statement - C#, Access 2013, VS Express 2013INSERT 语句中的语法错误 - C#、Access 2013、VS Express 2013
【发布时间】:2014-09-07 20:07:12
【问题描述】:

我一直在试图弄清楚为什么我的程序总是给我错误。 system.data.oledb.oledbexception(0x80040E14): INSERT INTO 语句中的语法错误。

  • 表名:User
  • 列:

    Username
    AccountNumber
    FirstName
    LastName
    

代码:

namespace Library_System
{
    public partial class CreateAccountWindow : Form
    {
        OleDbConnection connect = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data         Source=C:\Users\Jc\Documents\Visual Studio 2013\Projects\Library System\Library     System\LibrarySystemDatabase.accdb;Persist Security Info=False;");
    OleDbCommand command = new OleDbCommand();
    //OleDbDataReader reader;

    public CreateAccountWindow()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        string Username = "", AccountNumber = "", FirstName = "", LastName = "";
        //int Borrowed = 0;
        bool hasValue1 = false, hasValue2 = false, hasValue3 = false, hasValue4 = false;
        if (textBox1.Text != "")
        {
            label1.Hide();
            Username = textBox1.Text;
            hasValue1 = true;
        }
        else
        {
            label1.Show();
            label1.Text = "Required";
        }

        if (textBox10.Text != "")
        {
            label21.Hide();

            AccountNumber = textBox8.Text;
            hasValue2 = true;
        }
        else
        {
            label21.Show();
            label21.Text = "Required";
        }

        if (textBox8.Text != "")
        {
            label13.Hide();

            FirstName = textBox10.Text;
            hasValue3 = true;
        }
        else
        {
            label13.Show();
            label13.Text = "Required";
        }

        if (textBox7.Text != "")
        {
            label12.Hide();
            label12.Text = "Required";
            LastName = textBox7.Text;
            hasValue4 = true;
        }
        else
        {
            label12.Show();
            label12.Text = "Required";
        }

        if (hasValue1 || hasValue2 || hasValue3 || hasValue4)
        {
            try
            {
                connect.Open();
                OleDbCommand command = new OleDbCommand();
                command.Connection = connect;
                command.CommandText = "insert into User (Username,AccountNumber,FirstName,LastName) values ('" + Username + "','" + AccountNumber + "','" + FirstName + "','" + LastName + "')";
                command.ExecuteNonQuery();
                MessageBox.Show("REGISTRATION COMPLETE !!", "DONE");
                connect.Close();
            }
            catch (Exception ex)
            {
                connect.Close();
                MessageBox.Show("Error:"+ex.ToString());
            }
        }
    }
}

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 抱歉,您能说得更具体点吗?我刚刚开始使用 c# 3 周。我不太懂技术术语
  • @JC Balantakbo,AccountNumber 字段类型是什么?
  • @JCBalantakbo marc_s 的意思是您不应该通过连接字符串来创建 SQL 查询。例如,如果您的用户名类似于a','b','c','d');drop table User;--,请考虑将在数据库中执行什么。恶意用户可能会将其作为用户名来入侵您的系统。

标签: c# insert oledb ms-access-2013


【解决方案1】:

您收到错误是因为USER 是 Access SQL 中的保留字,因此您需要将表名括在方括号中。此外,正如 marc_s 在对该问题的评论中提到的那样,您应该使用这样的参数化查询:

// test data
string Username = "gord";
string AccountNumber = "gt001";
string FirstName = "Gord";
string LastName = "Thompson";

command.CommandText =
        "INSERT INTO [User] (Username, AccountNumber, FirstName, LastName) VALUES (?,?,?,?)";
command.Parameters.AddWithValue("?", Username);
command.Parameters.AddWithValue("?", AccountNumber);
command.Parameters.AddWithValue("?", FirstName);
command.Parameters.AddWithValue("?", LastName);
command.ExecuteNonQuery();

【讨论】:

    【解决方案2】:

    您需要一个 UNIQUE 字段作为主键。 Fields that generate numbers automatically in Access

    SelectCommand = "select @@IDENTITY";
    var id = (int)SelectCommand.ExecuteScalar();
    

    【讨论】:

    • 该错误与主键无关,[用户名]没有理由不能成为该表的主键。
    • 您应该手动检查它是否复制。您不能在主键字段中输入重复的名称。
    • 是的,但尝试插入重复的主键值不会导致问题中引用的“INSERT INTO 语句中的语法错误”错误。相反,这样的操作会触发“您请求对表的更改不成功,因为它们会在索引、主键或关系中创建重复值。”
    • @Gord Thompson,正确的语法,我认为是错误的数据类型。可能AccountNumber是一个数字字段。那它必须改成TextMemo类型。
    【解决方案3】:

    您是否尝试直接在数据库控制台上运行插入查询?在您的情况下,它的访问权限。你可能有一些拼写错误。 你已经初始化了 oledbcommand 对象两次。您可能不需要在 oledbconnection 对象之后对其进行初始化。

    还有关于您可以使用验证器的方法;检查此链接How to: Validate Data

    oledbcommand 参数请查看以下链接:

    OleDBParams

    Update Data using OLEDB

    Insert data using OLEDB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多