【问题标题】:Incorrect syntax near the keyword 'User'关键字“用户”附近的语法不正确
【发布时间】:2011-06-27 16:02:13
【问题描述】:

错误是:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常
附加信息:关键字“用户”附近的语法不正确。

代码是:

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

namespace WindowsFormsApplication1  
{  
    public partial class Form1 : Form  
    {  
        SqlConnection conn;  
        SqlDataAdapter GameDA;  
        SqlDataAdapter DetailDA;  
        DataSet DetailDS;  
        SqlCommandBuilder cmdBuilder;  
        SqlDataAdapter UserDA;  
        SqlDataAdapter AdministratorDA;  
        SqlDataAdapter OrderDA;  
        DataSet OrderDS;  
        SqlCommandBuilder cmdBuilder2;  

        public Form1()
        {
            InitializeComponent();
            conn = new SqlConnection("Data Source=HOME-AC284121FE\\SQLEXPRESS;Initial Catalog=GameShop;Integrated Security=SSPI;");
            SqlCommand command1 = new SqlCommand("SELECT * FROM Game", conn);
            GameDA = new SqlDataAdapter(command1);
            SqlCommand command2 = new SqlCommand("SELECT * FROM Detail WHERE GameID = @GameID", conn);
            command2.Parameters.Add(new SqlParameter("@GameID", SqlDbType.Int));
            DetailDA = new SqlDataAdapter(command2);
            SqlCommand command3 = new SqlCommand("SELECT * FROM Administrator", conn);
            AdministratorDA = new SqlDataAdapter(command3);
            SqlCommand command4 = new SqlCommand("SELECT * FROM User", conn);
            UserDA = new SqlDataAdapter(command4);
            SqlCommand command5 = new SqlCommand("SELECT * FROM Order WHERE UserID = @UserID", conn);
            command5.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int));
            OrderDA = new SqlDataAdapter(command5);
            cmdBuilder2 = new SqlCommandBuilder(OrderDA);
            cmdBuilder = new SqlCommandBuilder(DetailDA);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DetailDS = new DataSet();
            OrderDS = new DataSet();

            GameDA.Fill(DetailDS, "Game");
            **UserDA.Fill(OrderDS, "User"); // <-- Error**
            AdministratorDA.Fill(OrderDS, "Administrator");

            comboBoxGame.DisplayMember = "Name";
            comboBoxGame.ValueMember = "GameID";
            comboBoxGame.DataSource = DetailDS.Tables["Game"];

            dataGridView.DataSource = DetailDS.Tables["Detail"];
            dataGridView.Columns["GameID"].Visible = false;
            dataGridView.Columns["DetailID"].Visible = false;


        }

        private void comboBoxGame_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxGame.SelectedValue != null)
                if (DetailDS.Tables.Contains("Detail"))
                {
                    DetailDS.Tables["Detail"].Clear();
                }
            DetailDA.SelectCommand.Parameters[0].Value = comboBoxGame.SelectedValue;
            DetailDA.Fill(DetailDS, "Detail");
        }

        private void buttonExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow!当您输入问题时,右侧有一个 如何格式化 框,其中包含格式化的快速提示(带有四个空格的缩进代码,或编辑工具栏上的 {} 按钮)。问题区域上方还有一个 [?] 链接以获取更多详细信息,其下方还有一个预览区域用于检查结果。 (这只是下次。我去给你修好了,因为你是新人,我们喜欢帮助新人,但@Rup 打败了我。)

标签: c# sql database


【解决方案1】:

“用户”是 SQL Server 中的 reserved word,因此您必须使用 delimited identifier 来引用您的表。试试

SqlCommand command4 = new SqlCommand("SELECT * FROM [User]", conn);

改为...或将表重命名为未保留的名称。

(我也强烈建议您不要让数据访问您的 UI 代码,正确处理连接等......但这是另一回事。)

【讨论】:

    【解决方案2】:

    User 是 SQL Server 中的内置函数。您需要用方括号将名称括起来:[User]。这适用于所有碰巧与关键字、保留字或内置名称冲突的表名和其他用户定义的名称,因此我怀疑您也需要编写[Order],因为ORDER 是一个SQL 关键字。

    【讨论】:

    • Gah - 被 Jon Skeet 击败 2 秒... :-(
    猜你喜欢
    • 2016-06-08
    • 2013-12-16
    • 2017-11-22
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多