“]”附近的语法不正确。字符串'')'后的引号不闭合
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
声明您的命令,这样它会在以后处理
我已经在这个问题上停留了几个小时,我似乎无法克服导致这个问题出现的原因。当 运行 在调试模式下连接我的应用程序时,它将 运行 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
声明您的命令,这样它会在以后处理