Я пытаюсь удалить некоторые строки из таблицы в файле базы данных доступа через С#. Эта попытка завершается без ошибок, что приводит меня к выводу, что у меня есть правильный запрос с неверными данными.
Я попытался посмотреть, могу ли я запросить данные с помощью оператора select из моего кода, и я могу сузить проблему до параметров.
Заявление должно выглядеть следующим образом
SELECT * FROM tbIndex where pguid in ('4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6')
Я пробовал два разных способа*(dbCmd2 и dbCmd3)*, из которых первый*(dbCmd2)* работает, но из-за проблем с инъекциями это не мое предпочтительное решение.
using (OleDbCommand dbCmd2 = new OleDbCommand { Connection = m_Connection })
{
dbCmd2.CommandText = "SELECT * FROM tbIndex where pguid in ("+pguid+")";
using (DbDataReader reader = dbCmd2.ExecuteReader())
{
List<object[]> readValuesFromIndex = new List<object[]>();
while (reader.Read())
{
//Point reached
object[] arr = new object[reader.VisibleFieldCount];
reader.GetValues(arr);
//...
}
reader.Close();
}
using (OleDbCommand dbCmd3 = new OleDbCommand { Connection = m_Connection })
{
dbCmd3.CommandText = "SELECT * FROM tbIndex where pguid in (@pguid)";
dbCmd3.Parameters.Add("@pguid", OleDbType.VarChar).Value = pguid;
using (DbDataReader reader = dbCmd3.ExecuteReader())
{
List<object[]> readValuesFromIndex = new List<object[]>();
while (reader.Read())
{
//Point not reached
object[] arr = new object[reader.VisibleFieldCount];
reader.GetValues(arr);
//...
}
reader.Close();
}
}
Обратите внимание, что pguid
установлено на "'4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6'"
.
Я всегда думал, что второй вариант просто заменит параметр безопасным образом, но это явно не так.
Мой вопрос: Почему второй вариант не возвращает никаких значений?
When using a WHERE IN clause
). Вы рассматривали это как вариант здесь? - person mjwills   schedule 07.01.2019'4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6'
. Но на самом деле вы на самом деле просите, чтобы он соответствовал любой из набора записей. Увы, единственной (и единственной) записью в этом наборе является'4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6'
(обратите внимание, что это одна строка, а не четыре строки). - person mjwills   schedule 07.01.2019