#sql-server #vb.net #parameters
#sql-сервер #vb.net #параметры
Вопрос:
У меня есть запрос, который принимает в качестве параметра список дат. В VB.NET даты представлены в виде строки ArrayList
, и я использую этот String.Join()
метод, чтобы получить их в виде списка, разделенного запятыми. Проблема в том, что когда я делаю это, двойные кавычки ставятся в начале и конце строки, и SQL жалуется на это (я думаю; см. Ниже). Как я могу получить список дат из строки ArrayList
без кавычек.
Мой arraylist содержит эти значения:
'2020-08-30'
'2020-08-27'
'2020-09-28'
'2020-09-09'
'2020-08-31'
'2020-08-29'
когда я присоединяюсь к ним, используя String.Join(",", sDates)
, я получаю следующее:
"'2020-08-30','2020-08-27','2020-09-28','2020-09-09','2020-08-31','2020-08-29'"
и когда я использую это в запросе параметров, он отклоняется.
comm.Parameters.AddWithValue("@dates", String.Join(",", sDates))
sql содержит следующее»
...where pj.ProjectName =@projectname And tcd.Date in (@dates)
Точная ошибка, которую я получаю, это
System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Incorrect syntax near ','.
Source=.Net SqlClient Data Provider
Любой совет?
Комментарии:
1. Правильный способ сделать это — использовать параметр с табличным значением.
2. Также может быть одним из тех случаев, когда addwithvalue работает против вас. Не зная, какие типы данных tcd. Дата, но вы можете обнаружить, что AddWithValue предполагает, что вы работаете со строками и сравниваете их со столбцом даты
3.^^^ Можем ли мы уже прекратить использовать AddWithValue
4. Когда вы говорите «У меня есть запрос», вы имеете в виду хранимую процедуру? Если да, можем ли мы увидеть хранимую процедуру как часть вопроса?
5. Каков тип данных tcd.Date?
Ответ №1:
Это сообщение об ошибке:
Неправильный синтаксис рядом с ‘,’
Не вызвано тем, как вы выполнили свой ввод. Это вызвано чем-то другим, например, неуместной запятой в блоке выбора:
SELECT , a FROM x
^
То, как вы сделали свой IN, тоже не сработает, потому что концептуально это то же самое, что и написание this:
SELECT * FROM table WHERE dateColumn IN ('''2000-01-01'',''2000-02-01''')
Нет такой даты со строковым значением '2000-01-01','2000-02-01'
.
Если вы хотите использовать IN в стиле, который вы пытаетесь использовать здесь, вам нужно добавить параметр для каждого значения даты и настроить его соответствующим образом:
sqlCommand.CommandText = "SELECT * FROM table WHERE dateCol IN("
Dim p = 0
For Each d as DateTime in MyDateList
sqlCommand.CommandText amp;= "@p" amp; i amp; "," 'concat param placeholder on
sqlCommand.Parameters.AddWithValue("@p" amp; i, d)
i = 1
Next d
sqlCommand.CommandText = sqlCommand.CommandText.TrimEnd(","c) amp; ")" 'get rid of trailing comma and close the IN brackets
Это сгенерирует sql, подобный
SELECT * FROM table WHERE dateCol IN (@p0,@p1,@p2)
с 3 параметрами и заполненной коллекцией параметров. Вам уже указали на блог Джоэла о AddWithValue, поэтому я не буду его повторять.. Но я хотел сказать, что то, как вы представили свой вопрос, подразумевает, что у вас есть список строк, а не datetimes . Вы должны обязательно убедиться, что в вашем списке есть DateTimes, а столбец вашей базы данных должен иметь тип на основе даты, а не тип на основе строки