SQL语法错误 - ''附近的语法不正确

时间:2014-12-14 19:55:44

标签: c# sql sql-server winforms

我使用Visual Studio 2012并创建了一个简单的应用程序。我创建了一个名为Personnel的数据库,其中包含一个名为Employee的表。我已经解决了所有语法错误并且代码看起来很好,但是当我尝试使用表单将数据插入数据库时​​,我的表单 - Form1.cs会引发错误。

在我将数据插入字段后 - ID,名称,位置和每小时工资率,然后点击添加,它会在位置字段上窒息,错误会读取我在该字段中输入的内容。

例如,如果我进入"经理"在该表单字段中,错误窗口显示为:

' Manager'附近的语法不正确。

这里的任何帮助将不胜感激。这是我的代码:

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.SqlClient;

namespace Personnel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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

        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            SqlConnection cn = new SqlConnection(global::Personnel.Properties.Settings.Default.PersonnelConnectionString);
            try
            {
                string sql = "INSERT INTO Employee (employeeID,Name,Position,HourlyPayRate) values("+txtemployeeID.Text+",'"+txtName.Text+",'"+txtPosition.Text+",'"+txtHourlyPayRate.Text+"')";
                SqlCommand exeSQL = new SqlCommand(sql, cn);
                cn.Open();
                exeSQL.ExecuteNonQuery();

                MessageBox.Show("New record added!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.employeeTableAdapter.Fill(this.personnelDataSet.Employee);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                cn.Close();
            }
        }

        private void btnRef_Click(object sender, EventArgs e)
        {
            this.employeeTableAdapter.Fill(this.personnelDataSet.Employee);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

请阅读您帖子中的评论,他们已回答您的问题。

  1. 您的sql语法在其中一个字段后缺少单引号 值;姓名 - Andrew Barber
  2. SQL Injection alert - 您不应该将SQL语句连接在一起 - 使用参数化查询来避免SQL注入 - marc_s
  3. 以下是调整代码的方法:

    string sql = @"INSERT INTO Employee (employeeID,Name,Position,HourlyPayRate) 
                  VALUES(@employeeID, @Name, @Position, @HourlyPayRate )";
    SqlCommand exeSQL = new SqlCommand(sql, cn);
    cn.Open();
    cmd.Parameters.AddWithValue("@employeeID", txtemployeeID.Text);
    cmd.Parameters.AddWithValue("@Name", txtName.Text);
    cmd.Parameters.AddWithValue("@Position", txtPosition.Text);
    cmd.Parameters.AddWithValue("@HourlyPayRate", txtHourlyPayRate.Text);
    exeSQL.ExecuteNonQuery();
    

    阅读SqlCommand.Parameters Property

    编辑:

    AddWithValuenot 100% safe,最好使用Add()明确表示:

    cmd.Parameters.Add("@employeeID", SqlDbType.Int).Value = Convert.ToInt32(txtemployeeID.Text);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = txtName.Text;
    cmd.Parameters.Add("@Position", SqlDbType.VarChar).Value = txtPosition.Text;
    cmd.Parameters.Add("@HourlyPayRate", SqlDbType.Decimal).Value = Convert.ToDecimal(txtHourlyPayRate.Text);
    

    使用正确的SqlDbType Enumeration并相应地转换值。

答案 1 :(得分:0)

试试这个

应在每个相应的文本框值之前和之后添加单个代码

 string sql = "INSERT INTO Employee (employeeID,Name,Position,HourlyPayRate) values('"+txtemployeeID.Text+"','"+txtName.Text+"','"+txtPosition.Text+"','"+txtHourlyPayRate.Text+"')";

答案 2 :(得分:-1)

似乎你应该添加转义符,因为值(“+ txtemployeeID.Text +”...在值中展开(经理,...而不是值(“经理”,......