我想在数据库中插入一些数据,这些数据从我创建的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
我知道错误发生在查询的第一个值中。我在这里做错了什么?
答案 0 :(得分:1)
您不应该使用字符串连接进行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:您的直接问题可能是缺少字符串值的引号,但在任何情况下都不要连接它!
答案 1 :(得分:1)
非常糟糕的解决方案。
它可能是黑客。
更好地使用ADO.NET
<Tabs
...
classes={{indicator:classes.indicator}}
>
答案 2 :(得分:1)
简答
在您的查询中,您错过了将字符串(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;
剩下的参数供您练习和学习。
答案 3 :(得分:0)
我建议你检查引号是否正确使用双引号内的单引号, 将一个调试器放在String查询变量&amp;然后检查变量包含的是否具有正确的查询,&amp;根据变量值
中的错误进行更改答案 4 :(得分:0)
长查询往往很快就会变得非常混乱。正如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查询。
您获得语法异常的原因很可能是因为如果您将直接文本传递给查询,则必须将其包装在&quot;单引号&#39; 中。
对输入进行参数化可以保护您免受SQL注入/中毒的影响,并避免在查询中出现与数据类型声明相关的问题。
答案 5 :(得分:0)
请使用存储过程来解决此类错误。将数据保存到数据库时也很快。