在Visual Studio中的表上插入

时间:2018-04-18 10:10:34

标签: c# sql database visual-studio

我想在数据库中插入一些数据,这些数据从我创建的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

我知道错误发生在查询的第一个值中。我在这里做错了什么?

6 个答案:

答案 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)

请使用存储过程来解决此类错误。将数据保存到数据库时也很快。