преобразование sqlParameter - PullRequest
       20

преобразование sqlParameter

1 голос
/ 08 октября 2008

Я пытаюсь вызвать оператор SQL ниже, но получаю следующую ошибку:

System.Data.SqlClient.SqlException: преобразование не удалось при преобразовании значение varchar '+ @ buildingIDs +' для типа данных int.

@"SELECT id, startDateTime, endDateTime 
    FROM tb_bookings 
   WHERE buildingID IN ('+@buildingIDs+') 
     AND startDateTime <= @fromDate";

buildingID - это столбец типа int в БД. Нужно ли будет передавать идентификаторы в виде массива целых чисел?

Ответы [ 4 ]

2 голосов
/ 08 октября 2008

Путь Бравакса немного опасен. Я бы пошел со следующим, чтобы вас не атаковали с помощью SQL-инъекций:

int[] buildingIDs = new int[] { 1, 2, 3 };

/***/ @"SELECT id, startDateTime, endDateTime From tb_bookings WHERE buildingID IN (" +
      string.Join(", ", buildingIDs.Select(id => id.ToString()).ToArray())
      + ") AND startDateTime <= @fromDate"; 
1 голос
/ 08 октября 2008

Обратите внимание, что LINQ может сделать это через Contains (который отображается на IN). В обычном TSQL другой вариант - передать список как CSV (и т. Д.) Varchar и использовать табличную UDF для разделения varchar на части. Это позволяет использовать один запрос TSQL (выполнить INNER JOIN для результата UDF).

0 голосов
/ 08 октября 2008

Я бы предпочел пойти на хранимую процедуру, если это возможно, и передать списки идентификаторов как XML Вы можете получить более подробную информацию об этом подходе от здесь .

0 голосов
/ 08 октября 2008

Он пытается сравнить int со строковым значением '+ @ BuildingsID +'
Таким образом, он пытается преобразовать строку, чтобы преобразовать ее в int, и терпит неудачу.

Также сделайте следующее:
buildingsIDs = "1, 5, 6";<br> @"SELECT id, startDateTime, endDateTime From tb_bookings WHERE buildingID IN (" + buildingIDs + ") AND startDateTime <= @fromDate";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...