我想在数据库中插入一些数据,这些数据从我创建的Form中获取要插入的信息。我使用以下命令:
String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( "
+ NameBox.Text.Split(null)[0]+ " , "
+ SurnameBox.Text.Split(null)[0] + " , "
+ type + " , "
+ Convert.ToDouble(idNBox.Text) + " , "
+ gender + "," + Companybox.Text + " , "
+ delivery + " , " + DateTime.Now + " ,"
+ VisitingCombo.Text
+ " )";
该表是使用以下结构创建的,
CREATE TABLE [dbo].[Visits] (
[Name] NVARCHAR (50) NOT NULL,
[Surname] NVARCHAR (50) NOT NULL,
[DocType] NVARCHAR (50) NOT NULL,
[IdNumber] BIGINT NOT NULL,
[Gender] NCHAR (1) NOT NULL,
[Company] NVARCHAR (50) NOT NULL,
[Delivery] BIT NOT NULL,
[Entrance] DATE NOT NULL,
[Out] DATE NULL,
[Visting] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([IdNumber] ASC, [DocType] ASC, [Entrance] ASC),
FOREIGN KEY ([Visting]) REFERENCES [dbo].[Person] ([Name]));
运行代码时我尝试插入以下错误,
System.Data.SqlClient.SqlException:'''附近的语法不正确,'。'
对于插入,我使用了一些我在Nicholas Carey的回复中找到的代码,可以解决我的问题。 How to directly execute SQL query in C#? Have example batch file
我知道错误发生在查询的第一个值中。我在这里做错了什么?
您不应该使用字符串连接进行SQL查询构建,尤其是如果它是从用户输入部分接收的话。请注意SQL Injection攻击。
而是使用parameterized query:
var cmd = new SqlCommand(@"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting)
VALUES(@Name,@Surname,@DocType,@DocNumber,@Gender,@Company,@Delivery,@Entrance,@Visiting)", yourDbConnection);
cmd.Parameters.Add(new SqlParameter("@Name", NameBox.Text.Split(null)[0]));
//... Add other parameters in the same way
cmd.ExecuteNonQuery();
PS:您的直接问题可能是缺少字符串值的引号,但在任何情况下都不要连接它!
非常糟糕的解决方案。
它可以是黑客。
它更好地使用ADO.NET
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionCS"].ConnectionString))
{
StringBuilder sb = new StringBuilder();
sb.Append("INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES(@Name,@Surname,@DocType,@DocNumber,@Gender,@Company,@Delivery,@Entrance,@Visiting)");
using (SqlCommand com = new SqlCommand(sb.ToString(), con))
{
con.Open();
com.Parameters.Add("@Name", SqlDbType.NVarChar).Value = NameBox.Text.Split(null)[0];
//Add Other Parameter
//...
com.ExecuteScalar();
}
}
简答
在您的查询中,您错过了将字符串(varchar)值放在引号'
中。
例:
String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( "
+ "'" + NameBox.Text.Split(null)[0]+ "' , "
更好的答案:
您查询遭受SQL注入攻击和可维护性问题。您应该考虑参数化您的查询以避免它们。
例:
String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( "
+ "@Name, " ...
command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = NameBox.Text;
剩下的参数留给您练习和学习。
我建议你检查引号是否正确使用双引号内的单引号,在String查询变量上放一个调试器然后检查变量包含的是否有正确的查询,并根据错误更改在变量值
长时间的查询往往会很快变得非常混乱。正如Oleksandr所说,将信息传递给INSERT查询的方式非常危险。尝试这样的事情:
string query = "INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES(@name, @surname, @docType, @docNumber, @gender, @company, @delivery, @entrance, @visiting)";
string param = new {@name = NameBox.Text, @surname = SurnameBox.Text, ... @visiting = VisitingCombo.Text};
这意味着传递给数据库的任何信息都将作为字符串传递,而不是某些人能够通过不需要的SQL查询。
您获得语法异常的原因很可能是因为如果要将直接文本传递给查询,则必须将其包装在“单引号”中。
对输入进行参数化可以保护您免受SQL注入/中毒的影响,并避免在查询中出现与数据类型声明相关的问题。
请使用存储过程来解决此类错误。将数据保存到数据库时也很快。