【问题标题】:C# Insert Into syntax errorC#插入语法错误
【发布时间】:2016-06-22 18:37:36
【问题描述】:

我正在尝试将数据插入 MS Access 中的表中。我在 SQL 语句末尾不断收到错误缺少分号 (;)。或一个不同的错误,说我的插入查询需要有一个值或表。这是我的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;



namespace MiddleWare
{
public partial class Sales : Form
{
    public Sales()
    {
        InitializeComponent();
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        int empId = int.Parse(txtEmpID.Text);
        string cmdText = @"INSERT INTO [Sales] 
                        ([Printers], [Ink], [Paper])
               VALUES (@Printers,@Ink,@Paper)
               SELECT @EmpID FROM (Emplopyee)";

        using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\cp-stud-nas1\users\mat72462\Documents\SalesData.accdb"))
        using (OleDbCommand cmd = new OleDbCommand(cmdText, con))
        {
            con.Open();
            cmd.Parameters.AddWithValue("@Printers", OleDbType.VarWChar).Value = txtPrinters.Text;
            cmd.Parameters.AddWithValue("@Ink", OleDbType.VarWChar).Value = txtInk.Text;
            cmd.Parameters.AddWithValue("@Paper", OleDbType.VarWChar).Value = txtPaper.Text;
            cmd.Parameters.AddWithValue("@EmpID", OleDbType.VarWChar).Value = txtEmpID.Text;
            cmd.ExecuteNonQuery();

            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@EmpID", txtEmpID.Text);

            cmd.CommandText = "SELECT [Total Sales] FROM Sales WHERE EmpID=@EmpID";
            string result = cmd.ExecuteScalar().ToString();
            MessageBox.Show(result);

        }
    }

    private void Sales_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'DataSet1.DataTable1' table. You can move, or remove it, as needed.
        this.DataTable1TableAdapter.Fill(this.DataSet1.DataTable1);






    }

    private void btnReport_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\cp-stud-nas1\users\mat72462\Documents\SalesData.accdb");

        {
            this.DataTable1TableAdapter.Fill(this.DataSet1.DataTable1);

            this.reportViewer1.RefreshReport();
        }
    }
}
}

【问题讨论】:

  • 您可以显示确切的错误消息,而不是告诉错误消息。

标签: c# sql ms-access


【解决方案1】:

您应该用分号分隔查询

string cmdText = @"INSERT INTO [Sales] 
                ([Printers], [Ink], [Paper])
       VALUES (@Printers,@Ink,@Paper);
       SELECT @EmpID FROM (Emplopyee)";

您也不能将列名作为参数传递。在这种情况下使用动态查询。

【讨论】:

  • 错误:在 SQL 语句结束后发现字符。
  • 阅读我回答的最后一行。
  • 抱歉,我不确定什么是动态查询
  • SELECT @EmpID FROM (Emplopyee)是什么意思?你想达到什么目标?
  • 我正在尝试让它根据他们的员工 id 插入某些销售员的销售数据
【解决方案2】:

您应该将查询更改为:

 string cmdText = @"INSERT INTO [Sales] 
                    ([Printers], [Ink], [Paper], [EmpID])
           VALUES (@Printers,@Ink,@Paper,
                   SELECT EmpID FROM (Employee) )";

【讨论】:

  • 当我使用此查询时,我收到错误:您无法添加或更改记录,因为表 'Employees' 中需要相关记录。
  • 我收到错误:查询表达式“SELECT @EmpID FROM (Emplopyee)”中的语法错误。
  • 我修正了我的答案,如果您需要插入包括 empID 在内的四列
  • 现在它说:INSERT INTO 语句中的语法错误。
【解决方案3】:

它很可能应该是:

string cmdText = @"INSERT INTO [Sales] 
    ([Printers], [Ink], [Paper], [EmpID])
    VALUES (@Printers, @Ink, @Paper, @EmpID)";

【讨论】:

  • 这给了我错误:您请求对表的更改不成功,因为它们会在索引、主键或关系中创建重复值。更改字段中的数据或包含的字段
  • 它是一种用户输入他们的 id 和他们的销售额的表单。它根据员工 ID 插入该员工的销售额
  • 检查 Sales 的表设计,EmpID 不应该是主键或不允许重复,因为多个员工可以进行多次销售。 Sales 中的自动编号应该是 PK。
  • @Parfait 是对的。您的语法现在可以了,但您的数据(或表结构)却不行。
【解决方案4】:

“cmd.Paramter.AddWithValue”是不必要的。

尝试将您的 cmdText 格式化为

 cmd = "INSERT INTO [Sales] ([Printers], [Ink], [Paper])
     VALUES (" + txtPrinters.Text + " ," + txtInk.Text + ", " + txtPaper.Text + ")

这消除了“cmd.Paramter.AddWithValue”重复或覆盖值的混淆。

重写 btnUpdate_Click(也不确定 Emplopyee 是否是错字)

private void btnUpdate_Click(object sender, EventArgs e)
{
    using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\cp-stud-nas1\users\mat72462\Documents\SalesData.accdb"))
    using (OleDbCommand cmd = new OleDbCommand(cmdText, con))
    {
        con.Open();
        cmd = "INSERT INTO [Sales] ([Printers], [Ink], [Paper]) VALUES (" + txtPrinters.Text + " ," + txtInk.Text + ", " + txtPaper.Text + ") SELECT " + textEmpID.Text + " FROM (Emplopyee)";
        cmd.ExecuteNonQuery();

        cmd.CommandText = "SELECT [Total Sales] FROM Sales WHERE EmpID=@EmpID";
        string result = cmd.ExecuteScalar().ToString();
        MessageBox.Show(result);

    }
}

【讨论】:

  • 那么我应该摆脱 cmd.Paramter.AddWithValue 行,如果是,那么我应该将字符串 cmdtext 行放在哪里?
  • cmdText 行应该写在文本字段是您想要的值的地方。例如单击按钮初始化 cmdText 执行查询
猜你喜欢
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
相关资源
最近更新 更多