2017-02-20 5 views
-1

новое для кодирования и в настоящее время создающее систему баз данных для моего проекта уровня. Я пытаюсь взять данные из текстовых полей и ввести их в свою базу данных, однако мне представляется «Ошибка SqlException была необработанной ошибкой». Дополнительная информация: Неправильный синтаксис рядом с «Дата рождения». Вот код, написанный.Visual Basic SqlException

Connection.Open(); 
     SqlCommand Command = new SqlCommand(null, Connection); 
     Command.CommandText = String.Format("Insert into EmployeeTable (Forename,Surname,'Date of Birth','Email address','Phone number',Country,Address,City,Postcode,'Skill 1','Skill 2','Skill 3','Job 1','Job 2','Job 3','Employee Availability') Values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}',{11},{12},{13},{14})", ForenameInputBox.Text, 
      SurnameInputBox.Text, DoBInputBox.Text, EmailInputBox.Text, CountryInputBox.Text, AddressInputBox.Text, CityInputBox.Text, 
      PostcodeInputBox.Text, Skill1InputBox.Text, Skill2InputBox.Text, Skill3InputBox.Text, Job1InputBox.Text, Job2InputBox.Text, 
      Job3InputBox.Text, EmployeeAvailablityBox.Text); 
     Command.ExecuteNonQuery(); 
     Connection.Close(); 




CREATE TABLE [dbo].[EmployeeTable] (
[EmployeeID]   INT   NOT NULL, 
[Forename]    NVARCHAR (50) NOT NULL, 
[Surname]    NVARCHAR (50) NOT NULL, 
[Date of Birth]   DATETIME  NOT NULL, 
[Email address]   NVARCHAR (50) NOT NULL, 
[Phone number]   NVARCHAR (50) NOT NULL, 
[Country]    NVARCHAR (50) NOT NULL, 
[Address]    NVARCHAR (50) NOT NULL, 
[City]     NVARCHAR (50) NOT NULL, 
[Postcode]    NVARCHAR (50) NOT NULL, 
[Skill 1 ]    NVARCHAR (50) NOT NULL, 
[Skill 2]    NVARCHAR (50) NOT NULL, 
[Skill 3]    NVARCHAR (50) NOT NULL, 
[Job 1 ]    BIT   NOT NULL, 
[Job 2 ]    BIT   NOT NULL, 
[Job3 ]     BIT   NOT NULL, 
[Employee Availability] BIT   NOT NULL, 
PRIMARY KEY CLUSTERED ([EmployeeID] ASC) 

^Моя таблица определения


EDIT:

Connection.Open(); 
     SqlCommand Command = new SqlCommand(null, Connection); 
     Command.CommandText = "Insert into [EmployeeTable] (Forename,Surname,DateofBirth,Email address,Country,Address,City,Postcode,Skill1,Skill2,Skill3,Job1,Job 2,Job3,EmployeeAvailability) Values(@forename, @surname, @dateofbirth, @emailaddress, @phonenumber, @country, @address, @city, @postcode, @skill1, @skill2, @skill3, @job1, @job2, @job3, @employeeavailability)"; 
     Command.Parameters.AddWithValue("@forename", ForenameInputBox.Text); 
     Command.Parameters.AddWithValue("@surname", SurnameInputBox.Text); 
     Command.Parameters.AddWithValue("@dateofbirth", DoBInputBox.Text); 
     Command.Parameters.AddWithValue("@emailaddress", EmailInputBox.Text); 
     Command.Parameters.AddWithValue("@country", CountryInputBox.Text); 
     Command.Parameters.AddWithValue("@address", AddressInputBox.Text); 
     Command.Parameters.AddWithValue("@city", CityInputBox.Text); 
     Command.Parameters.AddWithValue("@postcode", PostcodeInputBox.Text); 
     Command.Parameters.AddWithValue("@skill1", Skill1InputBox.Text); 
     Command.Parameters.AddWithValue("@skill2", Skill2InputBox.Text); 
     Command.Parameters.AddWithValue("@skill3", Skill3InputBox.Text); 
     Command.Parameters.AddWithValue("@job1", Job1InputBox.Text); 
     Command.Parameters.AddWithValue("@job2", Job2InputBox.Text); 
     Command.Parameters.AddWithValue("@job3", Job3InputBox.Text); 
     Command.Parameters.AddWithValue("@employeeavailability", EmployeeAvailablityBox.Text); 
     Command.ExecuteNonQuery(); 
     Connection.Close(); 
    } 
} 

^Необработанное исключение типа 'System.Data.SqlClient.SqlException' произошло в System.Data.dll

Дополнительная информация: Неправильный синтаксис около 'адреса'.

+0

Вашего столбец не будет называться ' 'Датой Birth'', в чем его фактическом имя? То же самое для остальных внутри кавычек. Кроме того, посмотрите на параметризованные запросы, ваш текущий код открыт для атаки. – Equalsk

+0

Вот мое определение таблицы, я подумал, что это будет дата рождения, так как здесь он говорит? –

+0

Имена столбцов не будут иметь пробелов. – Equalsk

ответ

1

Вы должны квалифицироваться ваши имена столбцов в квадратных скобках, например: [] вместо одинарные кавычки/апострофы

здесь является пересмотр по Вашему запросу:

/// .. reformatted sql string 
Command.CommandText = String.Format("Insert into [EmployeeTable] (Forename,Surname,[Date of Birth],[Email address],[Phone number],Country,Address,City,Postcode,[Skill 1],[Skill 2],[Skill 3],[Job 1 ],[Job 2 ],[Job3 ],[Employee Availability]) Values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}',{11},{12},{13},{14},{15})", ForenameInputBox.Text, 
     SurnameInputBox.Text, DoBInputBox.Text, EmailInputBox.Text, CountryInputBox.Text, AddressInputBox.Text, CityInputBox.Text, 
     PostcodeInputBox.Text, Skill1InputBox.Text, Skill2InputBox.Text, Skill3InputBox.Text, Job1InputBox.Text, Job2InputBox.Text, 
     Job3InputBox.Text, EmployeeAvailablityBox.Text); 
+0

Это исправило эту ошибку, но теперь она заявляет, что у меня есть Дополнительная информация: Недопустимое имя столбца «Job 3». В инструкции INSERT больше столбцов, чем значений, указанных в предложении VALUES. Количество значений в предложении VALUES должно соответствовать количеству столбцов, указанных в инструкции INSERT. ' –

+0

Однако есть 15 значений и 15 столбцов, так как я установил EmployeeID для автоматического создания, мне все еще нужно что-то добавить для этого? –

+0

В запросе задано 16 столбцов. – Equalsk

0

Это на самом деле не лучшая практика, чтобы захватить ваши имена столбцов базы данных содержат пробелы в них. Я бы изменил имена столбцов, чтобы использовать корпус верблюда (то есть: DateOfBirth), таким образом вам не нужно будет использовать одиночные кавычки в строке, которая является причиной ошибки здесь.

Если необходимо, чтобы вы сохраняли пробелы в именах столбцов, измените «Дата рождения» на [Дата рождения] и т. Д. Для других столбцов, содержащих пробелы.

+0

Хорошо, спасибо за помощь, это будет иметь в виду. –

0

Существует несколько факторов, которые могут привести к ошибкам.

  1. 16 столбцов, но 15 входных параметров
  2. Колонка со значением не предусмотрено, такие как «Номер телефона»
  3. имя столбца не совпадают в тексте запроса. «Job 3» в запросе, «Job3» в таблице
  4. Использовать квадратные скобки [] вместо одной оговорки в качестве разделителя столбцов
  5. Есть ли проверка входного текста? Такие, как недопустимые символы, соответствующий формат типа данных, превышено длина и т.д.
+0

Привет, только что исправил эти вещи, спасибо. И нет, я еще не добавил никаких подтверждений. Идем искать, как. –

0

Это лучшая практика, чтобы не иметь пробела в именах столбцов, вместо того, чтобы использовать подчеркивание или верблюд корпус для достижения читаемого имени:

нижнего подчеркивания:

date_of_birth

Camel корпус:

DateOfBirth

Вы должны смотреть на параметризованных запросов при выполнении команды против вашей базы данных. Если вы этого не сделаете, вы можете атаковать, например, кто-то потенциально может удалить всю вашу таблицу.

Relevant XKCD on 'Little Bobby Tables'

Вы код должен выглядеть следующим образом (я удалил некоторые столбцы для краткости):

Connection.Open(); 
SqlCommand command = new SqlCommand(null, Connection); 
command.CommandText = "Insert into EmployeeTable (Forename,Surname,[Date of Birth], ... , ...) Values(@forename, @surname, @dateofbirth,...,...)"; 
command.Parameters.AddWithValue("@forename", ForenameInputBox.Text); 
command.Parameters.AddWithValue("@surname", SurnameInputBox.Text); 
command.Parameters.AddWithValue("@dateofbirth", DoBInputBox.Text); 
... 
... 
command.ExecuteNonQuery(); 
Connection.Close(); 
+0

Я использовал этот формат и получил это сообщение об ошибке: –

+0

Необработанное исключение типа «System.ArgumentException» произошло в System.Data.dll Дополнительная информация: сопоставления не существует из типа объекта System.Windows.Controls.TextBox к известному управляемый собственный носитель. –

+0

Я угадываю, где-то вы пропустили .Text с конца имени текстового поля, например. вы поместили SurnameInputBox вместо SurnameInputBox.Text – Equalsk