“]”附近的语法不正确。字符串'')'后的引号不闭合

Incorrect syntax near ']'. Unclosed quotation mark after the character string '')'

我已经在这个问题上停留了几个小时,我似乎无法克服导致这个问题出现的原因。当 运行 在调试模式下连接我的应用程序时,它将 运行 foreach 两次成功返回“查询已执行!”。

然而,当它第三次出现时,我得到这个错误:

Incorrect syntax near ']'.Unclosed quotation mark after the character string '')'.

我的方法将执行插入 SQL 服务器 table Logs:

static String connectionString = "Data Source=.\SQLExpress;Database=ElasticSearchService;Trusted_Connection=True;";

        public static async Task<int> InsertLogData()
        {
            SqlConnection connection = null;
            SqlCommand command = null;
            int numrows = 0;

            try
            {
                var response = await _elasticClient.SearchAsync<EsSource>(s => s
                   .Size(3000)
                   .Source(src => src.Includes(i => i
                                     .Fields(f => f.timestamp,
                                             fields => fields.messageTemplate,
                                             fields => fields.message)))
                   .Index("customer-simulation-es-app-logs*")
                   .Query(q => +q
                       .DateRange(dr => dr
                           .Field("@timestamp")
                               .GreaterThanOrEquals("2021-06-07T17:13:54.414-05:00")
                               .LessThanOrEquals(DateTime.Now))));

                // var json = _elasticClient.RequestResponseSerializer.SerializeToString(response);

                connection = new SqlConnection(connectionString);

                Console.WriteLine("\nOpening connection...");

                connection.Open();

                Console.WriteLine("\nConnection successful!");

                foreach (var item in response.Hits)
                {
                    var dateCreated = item.Source.timestamp;
                    var messageTemplate = item.Source.messageTemplate;
                    var message = item.Source.message;


                    command = new SqlCommand("insert into Logs (DateCreated, MessageTemplate, Message) values ('" + dateCreated + "', '" + messageTemplate + "', '" + message + "')", connection); 

                    numrows = command.ExecuteNonQuery();

                    Console.WriteLine("\nQuery Executed!");
                }
                connection.Close();
                Console.WriteLine("\nConnection Closed....");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
            finally
            {
                command.Dispose();
                connection.Dispose();
            }
            return numrows;
        }

是否有我没有看到的原因造成的?是我的 command = new SqlCommand() 不正确导致它出现以下错误:

Incorrect syntax near ']'.Unclosed quotation mark after the character string '')'.

初学者:

command = new SqlCommand("insert into Logs (DateCreated, MessageTemplate, Message) values (@dt, @mt, @m)";

command.Parameters.AddWithValue("@dt", dateCreated);
command.Parameters.AddWithValue("@mt", messageTemplate);
command.Parameters.AddWithValue("@m", message);

然后执行

熟悉后,阅读 this blog - AddWithValue 很方便,但在某些情况下可能会导致性能问题。对于插入语句之类的东西,我不太关心它,但我建议你阅读博客,看看为什么你应该在 SQL 服务器中养成习惯,一旦你失望了参数化如何工作。同样值得注意的是,并非每个数据库都存在 AWV 问题,并且在很大程度上,使用它并偶尔遇到性能问题比根本不使用参数化并被黑要好

SQL 以您获得它的方式(以及我获得它的方式)添加参数等实际上相当乏味。看看 dapper,这是一个库,它可以让做这类事情和更多事情变得容易得多,例如 运行ning 一个 sql 查询并将结果集转换为一个 c# 对象列表,一个有点像解析 Json

其他需要考虑的事项:

  • 使用 ExecuteNonQueryAsync
  • 在 foreach 循环之外创建您的命令,并使用 AddWithValue 添加正确类型的虚拟参数(或抓住机会分支到添加精心构造的正确 sql 数据库类型的参数),然后打开连接和 运行 循环,在循环的每一次传递中更改参数值。总结:设置一次,更改值并执行1000次,而不是设置1000次
  • 使用 using 声明您的命令,这样它会在以后处理