【问题标题】:SQL syntax error - incorrect syntax near ' 'SQL 语法错误 - ' ' 附近的语法不正确
【发布时间】:2014-12-14 19:55:43
【问题描述】:

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

在我将数据插入字段 - ID、姓名、职位和每小时工资率后,然后单击添加,它在职位字段上阻塞,并且错误读取我在该字段中键入的任何内容。

例如,如果我在该表单字段中输入“经理”,错误窗口会显示:

“经理”附近的语法不正确。

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

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);
        }
    }
}

【问题讨论】:

  • 您的 sql 语法在其中一个字段值之后缺少单引号;名称
  • SQL Injection alert - 你应该将你的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 加上@marc 所说的!
  • 感谢所有发布的内容。由于您的许多建议,我现在工作得很好。谢谢!

标签: c# sql sql-server winforms


【解决方案1】:

请阅读您帖子下方的 cmets,他们回答了您的问题。

  1. 您的 sql 语法在其中一个字段后缺少单引号 价值观;姓名 – Andrew Barber
  2. SQL Injection alert - 你不应该将你的 SQL 语句连接在一起 - 使用参数化查询来避免 SQL 注入 - marc_s

你应该如何调整你的代码:

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 并相应地转换值。

【讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 哦,我想我读过这个你以前给我的。问题是我必须知道列类型才能给出正确的答案,因为add() 抛出异常
  • 同意 - 人们可以猜测EmployeeID 可能是int(或者应该是!),而HourlyPayRate 很可能是decimal排序,其余的可以安全地假设为字符串....当然只是猜测,因为原始帖子没有说明这一点....
  • @marc_s 你有一个有效的观点我编辑了我的帖子试图展示这一点。这么多代码,这就是我更喜欢 EF 的原因 :)
【解决方案2】:

试试这个

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

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

【讨论】:

    【解决方案3】:

    似乎你应该添加转义字符,因为 values("+txtemployeeID.Text+"... 在 values(Manager,... 而不是 values("Manager",...

    【讨论】:

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