【发布时间】:2021-07-11 18:27:40
【问题描述】:
我已经在这个问题上停留了几个小时,我似乎无法克服导致这个问题出现的原因。在调试模式下运行我的应用程序时,它将运行 foreach 两次成功返回“查询已执行!”。
但是,当它第三次运行时,我得到了这个错误:
']' 附近的语法不正确。字符串'')' 后面的未闭合引号。
我的方法将执行插入到 SQL Server 表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() 是否不正确导致它出现以下错误:
']' 附近的语法不正确。字符串'')' 后面的未闭合引号。
【问题讨论】:
-
也请请请学习参数化。现在是 2021 年;SQL 注入现在应该像恐龙一样消亡了。
-
很可能是由于消息字符串的内容以及您如何插入。字符串内容可能有引号关闭您的插入语句。如果您使用参数,这将不是问题,并且不会受到注入攻击。
-
@Larnu 对不起,我把它放了以防有人想要视觉效果,但我会删除它。
-
我正在研究 SQL 参数,但是当涉及到它的值部分时,我有点迷茫。当我执行插入的 value() 部分时,是否需要在 SSMS 中进行某种类型的配置才能引用每一列? IE。我的插入是
"insert into Logs (DateCreated, MessageTemplate, Message) values()。我可以只做列的名称并在其前面放置一个@,即values(@DateCreated, @MessageTemplate, @Message),还是它应该有一个唯一的名称?如果是这样,我将如何配置它? @penleychan
标签: c# sql-server elasticsearch ssms console-application