Faran Saleem Ответов: 4

Передача нескольких значений через форму в SQL in keyword


Привет ребята,

У меня есть форма с 3 полями. 1 - это номер карты, который является динамическим, то есть пользователь может добавить больше номеров карт, когда он нажимает на кнопку Добавить больше. А остальные 2 поля - это дата начала и дата окончания.
Я хочу, чтобы, когда пользователь нажимает кнопку Отправить после заполнения всех деталей, значения будут проходить через параметры в бэкэнд-базе данных, извлекать записи и отображаться в frontend gridview.
Но проблема в том, что я не могу передать несколько значений через параметр.
Например, если будут представлены 3 номера карт и даты.
Sql-запрос должен быть таким
выберите * из таблицы, где карты в (@card) и дата между @startdate и @enddate.
Итак, в приведенном выше примере, как я могу передать несколько номеров карт в одном параметре (@card), и я не знаю, сколько именно номеров карт будет отправлено. Их может быть 3, 4, 5 и так далее.
Пожалуйста помочь.

Что я уже пробовал:

Много гуглил об этом, и люди публиковали сообщения, чтобы использовать таблично значимые параметры. Но я не уверен, как их использовать, а также не знаю, будут ли они работать в этом сценарии, так как количество карт в этом случае не фиксировано.

4 Ответов

Рейтинг:
1

OriginalGriff

В вашем случае это числа, так что вы можете просто передать их в виде списка, разделенного запятыми:

List<int> data = new List<int>() {1, 2, 3};
string sqlCmd = string.Format("SELECT * FROM MyTable WHERE Cards IN ({0}) AND [Date] BETWEEN @startdate AND @enddate", String.Join(",", data));
Но это не очень хороший подход в целом, поскольку он оставляет вас открытыми для SQL-инъекций.
Это один из способов обойти его: Использование SqlParameter с предложением SQL IN в C# | SvenBit - Sebastian Hadinata[^]


Рейтинг:
1

Keviniano Gayo

Вот как использовать табличные параметры. (вышеуказанные решения также могут работать)
1. Создайте тип таблицы в своей базе данных:

CREATE TYPE CardTableType AS TABLE   
( Card VARCHAR(50)  )  

2. вы создаете хранимую процедуру, которая принимает табличный параметр:
CREATE PROCEDURE dbo. usp_GetCards 
    @Cards CardTableType READONLY  
    AS   
    SET NOCOUNT ON  
    Select ... Where Card in (Select card From @Cards)..

3. В вашем .чистый код:
param = new SqlParameter("@Cards", dataTableCardType);
                param.TypeName = "CardTableType";
                param.SqlDbType = SqlDbType.Structured;
                cmd.Parameters.Add(param);


За дополнительной информацией: Использование Табличных Параметров (Компонент Database Engine)[^]


Рейтинг:
1

SanthoshBabu Mahimairaj

Привет,

Я думаю, что вы использовали тип данных Varchar для CardID, поэтому попробуйте сформировать запрос следующим образом


Select * from table where cards in (@card) and date between @startdate and @enddate

@card should be '1','2','3'


это будет работать


Рейтинг:
0

Rahul_Biswas

1. Создайте SQLParameter @cardxml типа XML. Поместите все выбранные пользователем карты в параметр в формате < value> 1< value> 2.... и т. д.
2. Используйте такой запрос
'select * from table
где карты в (
выберите N.значение('./текст()[1]','инт') от @cardsxml.узлы('./значение') как V(Н)
)
и дата между @startdate и @enddate'
3. предпочтительно использовать SP, чтобы сделать это. Я предполагаю, что вы используете SQL Server в качестве бэкэнда.

Другой подход-
Отправьте разделенный запятыми список значений карт в бэкэнд, а затем проанализируйте его в бэкэнде, используя описанные методы sql server-функция разделения, эквивалентная в T-SQL? - переполнение стека[^]