Использование списка для объявления параметра в моей инструкции SQL - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть список, в котором можно выбрать несколько значений.

Вот мой запрос для моего gridview

saocmd.CommandText = "SELECT B603SalesAsOFMASTER.SDESCR, B603SalesAsOFMASTER.DYYYY, B603SalesAsOFMASTER.AsOFSales, B603SalesAsOFMASTER.ASOFPAX, B603SalesAsOFMASTER.YESales, B603SalesAsOFMASTER.YEPAX, B603SalesAsOFMASTER.PCTofSales, B601SalesAsOF.Sales AS CurrentSales, B601SalesAsOF.PAX AS CurrentPAX FROM B603SalesAsOFMASTER INNER JOIN B601SalesAsOF ON B603SalesAsOFMASTER.SDESCR = B601SalesAsOF.SDESCR WHERE (B603SalesAsOFMASTER.DYYYY =@Dyyyy) AND (B601SalesAsOF.DYYYY = (year( getdate() ))) and B603SalesAsOFMASTER.SDESCR in (@regions)order by B603SalesAsOFMASTER.SDESCR"

Вот мой запрос для моего списка

listcmd.CommandText = "SELECT distinct B603SalesAsOFMASTER.SDESCR FROM B603SalesAsOFMASTER"

Я хочу, чтобы пользователь выбрал все области, которые он хочет запросить в виде сетки.

на данный момент я помещаю каждый выбранный элемент списка в текстовое поле

Function list()
    Dim li As ListItem
       For Each li In ListBox1.Items
         If li.Selected Then
            TextBox1.Text &= "'" & li.Text & "' ," & vbCrLf
       End If
Next
End Function

, а затемперед выполнением запроса я использую для вычитания финал, поэтому я не получаю сообщение об ошибке, и мне нужно использовать textbox1.text в моем запросе, а не параметр.это медленнее и инъекция sql, мне нужна помощь, чтобы сделать это лучше, спасибо

If TextBox1.Text.EndsWith(",") Then
        TextBox1.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - 1)
            End If

1 Ответ

1 голос
/ 23 декабря 2010

Вы не можете использовать ваш список через запятую в качестве параметра для вашей команды выбора. Вам нужно написать табличную функцию, которая выполняет итерацию ваших параметров в вашей базе данных (MS-SQL-Server?): Список значений через запятую

CREATE FUNCTION iter$simple_intlist_to_tbl (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END
...