【问题标题】:System.Data.SqlClient.SqlException: 'Incorrect syntax near '.'.'System.Data.SqlClient.SqlException:''.' 附近的语法不正确。'
【发布时间】:2020-11-24 08:33:59
【问题描述】:

我尝试使用 SQL 来了解 .Net Core Wep API。我在'.''附近得到了不正确的语法。'

我使用邮递员作为 api 并尝试它是否带有 json。

在 appsettings.json 代码中;

{
  "ConnectionStrings": {
    "EmployeeAppCon": "Data Source=.;Initial Catalog=EmployeeDB; Integrated Security=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

我尝试了 get, post 方法,但我在这里使用 Uptade 方法出现错误;

[HttpPut]
        public JsonResult Put(Department dep)
        {
            string query = @"
                       Uptade dbo.Department set 
                       DepartmentName='"+dep.DepartmentName+@"'
                       where DepartmentId="+dep.DepartmentId+@"
                       ";
            DataTable table = new DataTable();
            string sqlDataSource = _configuration.GetConnectionString("EmployeeAppCon");
            SqlDataReader myReader;
            using (SqlConnection myCon = new SqlConnection(sqlDataSource))
            {
                myCon.Open();
                using (SqlCommand myCommand = new SqlCommand(query, myCon))
                {
                    myReader = myCommand.ExecuteReader();
                    table.Load(myReader); ;
                    myReader.Close();
                    myCon.Close();
                }

            }
            return new JsonResult("Uptade Successfull");

        }

我的错在哪里,请帮帮我,非常感谢?

【问题讨论】:

  • 在查询中使用参数来解决您的问题以及任何注入问题。这个词也是更新而不是更新
  • 部门名称可以包含单引号和大量的SQL。这也容易发生 SQL 注入。
  • 非常小,但是:new JsonResult("Uptade Successfull") [原文如此] 很奇怪...因为:那不是 JSON
  • (只是添加:除了连接导致错误的位,并为您打开 SQL 注入 - 它也会导致 i18n/l10n 问题(特别是日期和数字),并且是次优的查询计划重用;所以:基本上“总是使用参数”:)

标签: sql json .net


【解决方案1】:

这很可能是 SQL 中的连接问题;长话短说:从不将输入连接到 SQL; 正确的操作更像:

update dbo.Department
set DepartmentName=@name
where DepartmentId=@id

其中@name@id 是参数。

然后您将使用myCommand.Parameters.Add(...) 来包含这两个参数及其名称/值,并使用ExecuteNonQuery(而不是ExecuteReader)。

但是!让Dapper(免费等)为我们完成所有艰苦的工作会简单得多,然后我们可以这样做:

using var myCon = new SqlConnection(sqlDataSource); // don't even need to open it
myCon.Execute(@"
update dbo.Department
set DepartmentName=@name
where DepartmentId=@id",
    new { name = dep.DepartmentName, id = dep.DepartmentId });

这里的new {...} 用值定义了我们的命名参数。

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2019-07-17
    • 2017-12-08
    • 2014-05-09
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多