新编码,目前为我的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
中其他信息:地址'附近的语法不正确。
答案 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)
有多种因素可能会导致错误。
答案 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();