System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с'. '.'

Nov 24 2020

Я пытаюсь рассказать что-то о .Net Core Wep API с SQL. У меня неправильный синтаксис рядом с '.' ''.

Я использую почтальон для 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": "*"
}

И я пытался получить, отправить метод, но у меня здесь ошибка с методом 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");

        }

В чем моя вина, пожалуйста, помогите мне большое спасибо?

Ответы

2 MarcGravell Nov 24 2020 at 08:41

Скорее всего, это проблема конкатенации в 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 {...}здесь определены наши именованные параметры со значениями.