【问题标题】:Insertion on table in Visual Studio在 Visual Studio 中的表上插入
【发布时间】:2018-04-18 10:10:34
【问题描述】:

我想在数据库中插入一些数据,该数据库从我创建的表单中获取要插入的信息。我正在使用以下命令:

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

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

【问题讨论】:

  • 渲染的query字符串的值是多少?
  • 您确定您的任何文本框中都没有逗号吗?只需在声明后执行 MessageBox.Show(query) 即可对其进行测试。也总是像 Olaksandr 建议的那样使用参数化查询 - 这样可以省去很多麻烦。
  • @Jerodev 这将是查询link

标签: c# sql database visual-studio


【解决方案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:您的直接问题可能是字符串值周围缺少引号,但在任何情况下都不要连接!

【讨论】:

    【解决方案2】:

    这是非常糟糕的解决方案。

    它可以被破解。

    最好使用 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();
            }
        }
    

    【讨论】:

      【解决方案3】:

      简答

      在您的查询中,您错过了将字符串 (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; 
      

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

      【讨论】:

        【解决方案4】:

        我建议您检查引号是否正确或不要在双引号内使用单引号, 在字符串查询变量上放置一个调试器,然后检查变量包含的内容是否具有正确的查询,并根据变量值中的错误进行更改

        【讨论】:

          【解决方案5】:

          长查询往往很快就会变得非常混乱。正如 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 查询。

          您收到语法异常的原因很可能是因为如果您将直接文本传递给查询,则必须将其包装在 'single quotes' 中。

          参数化您的输入既可以保护您免受 SQL 注入/中毒,又可以避免与查询中的数据类型声明相关的问题。

          【讨论】:

            【解决方案6】:

            请使用存储过程来解决此类错误。将数据存入数据库的速度也很快。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-07-12
              • 1970-01-01
              相关资源
              最近更新 更多