在Visual Studio中的表上插入

问题描述 投票:0回答:6

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

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

c# sql database visual-studio
6个回答
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
投票

非常糟糕的解决方案。

它可以是黑客。

它更好地使用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();
        }
    }

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; 

剩下的参数留给您练习和学习。


0
投票

我建议你检查引号是否正确使用双引号内的单引号,在String查询变量上放一个调试器然后检查变量包含的是否有正确的查询,并根据错误更改在变量值


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查询。

您获得语法异常的原因很可能是因为如果要将直接文本传递给查询,则必须将其包装在“单引号”中。

对输入进行参数化可以保护您免受SQL注入/中毒的影响,并避免在查询中出现与数据类型声明相关的问题。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.