Visual Basic SqlException

时间:2017-02-20 16:40:56

标签: c# sql sqlclient

新编码,目前为我的a-level项目制作数据库系统。我试图从文本框中获取输入并将它们输入到我的数据库中,但是我遇到了一个' 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)

^我的表定义

编辑:

 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

其他信息:地址'附近的语法不正确。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

捕获包含空格的数据库列名称并不是最佳实践。我会更改列名称以使用camel大小写(即:DateOfBirth),这样你就不需要在字符串中使用单引号,这是引起错误的原因。

如果您必须坚持使用列名称中的空格,则将“出生日期”更改为[出生日期],依此类推其他包含空格的列。

答案 2 :(得分:0)

有多种因素可能会导致错误。

  1. 16列但15个输入参数
  2. 未提供值的列,例如“电话号码”
  3. 列名在查询文本中不匹配。查询中的“作业3”,表格中的“作业3”
  4. 使用方括号[]代替单引号作为列限定符
  5. 是否有输入文字的验证?如非法字符,正确的数据类型格式,超出长度等。

答案 3 :(得分:0)

最佳做法是在列名中不要使用空格,而是使用下划线或驼峰套管来获得可读名称:

下划线

  

DATE_OF_BIRTH

骆驼套管:

  

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