2014-12-14 5 views
0

Я использую Visual Studio 2012 и создал простое приложение. Я создал базу данных под названием Personnel с таблицей Employee. Я проработал все мои синтаксические ошибки, и код выглядит отлично, но моя форма - Form1.cs выдает ошибку, когда я пытаюсь вставить данные в базу данных с помощью формы.Синтаксическая ошибка 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.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); 
     } 
    } 
} 
+1

Ваш синтаксис SQL отсутствует апостроф после одного из значений поля; Имя –

+4

[SQL Injection alert] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** объединить свои SQL-запросы - используйте ** параметризованные запросы ** вместо этого, чтобы избежать SQL-инъекции –

+1

Плюс, что сказал @marc! –

ответ

-1

Кажется, вы должны добавить экранирующий символ, так как значения («+ txtemployeeID.Text +» ... расширяется в значениях (менеджер, ... вместо значений («Менеджер», ...

3

Пожалуйста, прочитайте комментарии под ваш пост они ответили на ваш вопрос

  1. Ваш синтаксис SQL отсутствует апостроф после одного из значений поля, имя -Andrew Barber
  2. . 210
  3. 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

Edit:

AddWithValue является not 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 и преобразовать значения соответственно.

+0

Вы должны проверить [Можем ли мы остановить использование AddWithValue() уже?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) и перестать использовать '.AddWithValue()' - это может привести к неожиданным и неожиданным результатам ... –

+0

О, я думаю, что прочитал это, ты дал мне это раньше. Проблема в том, что мне нужно знать тип столбцов, чтобы дать правильные ответы, потому что 'add()' throws exceptions – meda

+1

согласен - можно было * угадать *, что 'EmployeeID', вероятно, является' int' (или должен быть!), HourlyPayRate', скорее всего, будет «десятичным» сортам, а остальные могут быть смело считаться строками ... Просто думаю, конечно, поскольку исходный пост не сделал этого ясным .... –

0

Попробуйте один

единственный код должен быть добавлен до и после каждого соответствующего текстового поля значения

string sql = "INSERT INTO Employee (employeeID,Name,Position,HourlyPayRate) values('"+txtemployeeID.Text+"','"+txtName.Text+"','"+txtPosition.Text+"','"+txtHourlyPayRate.Text+"')"; 
Смежные вопросы