пятница, 20 мая 2011 г.

SQL error: "Too many parameters were provided in this RPC request" или ошибка 2100 парметров в SQL запросе

Причиной этой ошибки является ограничение количества параметров который можно передать в SQL команду. Обычно данная ситуция возникает когда нужно вычитать список сущностей по идентификатору.
SELECT *  FROM table WHERE Id = idValue1 OR Id = idValue2 OR Id = idValue3 ...OR Id = idValue3000
или
SELECT *  FROM table WHERE Id IN (idValue1,idValue2,idValue3...idValue3000)

Возникает  эта ситуация конечно не часто,  но и она имеет место быть. Заявления вроде "Да как вы вообще допустили появления таких запрсов в системе!" - не принимаются. Различные системы, различные архитектурные ограничения...  И  вот, пожалуйста,  все упирается в необходимость вычитать из базы 3000 сущностей по дентификатору...

Задача.
Имеется исходная коллекция  идентификатов сущностей А. Коллекция может содежать больше 2100 элементов ( а може и меньше, но это не важно. Как и не важно то,  как и откуда эта коллекция взялась. Она есть.). Необходимо вычитать из базы все сущности А, айдишники которых присутствуют в коллекции идентификаторов . Порядок вычитанных сущностей должен совпадать с порядком следования элементов в исходной коллекции идентификаторов.

Решение.
Продолжение следует...

Вычитка коллекции по частям

Задача.
Есть типизированная коллекция. Необходимо производить последовательную вычитку коллекции по частям. Например, коллекция из 10 элементов. Последовательно вычитать первые 4 элемента, вторые 4 элемента и тд.

Решение.  
Sub Main()
  Dim l As New List(Of Integer)
  l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
  Dim total As Integer = l.Count
  Dim sizeOfPage As Integer = 4
  Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
    For i As Integer = 0 To qantityOfPages
      Dim startPos As Integer = i * sizeOfPage
      Dim innerList As List(Of Integer) = l.Skip(startPos).Take(sizeOfPage).ToList
      For Each ed In innerList
        Console.WriteLine(ed.ToString)
      Next
      Console.WriteLine()
    Next
  Console.ReadLine()
End Sub

Ниже аналогичное решение, но полностью на foreach ... next и if ... end if

Sub Main()
  Dim l As New List(Of Integer)
  l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
  Dim total As Integer = l.Count
  Dim sizeOfPage As Integer = 4
  Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
    For i As Integer = 0 To qantityOfPages
      Dim startPos As Integer = i * sizeOfPage
      Dim endPos As Integer = startPos + sizeOfPage
        For ed As Integer = startPos To endPos - 1
          If ed < l.Count Then
            Console.WriteLine(l.Item(ed).ToString)
          Else
            Exit For
          End If
        Next
        Console.WriteLine()
    Next
  Console.ReadLine()
End Sub

в обоих случаях получаем следущее:

четверг, 19 мая 2011 г.

TextBox и Еnter

:)
Присутствовала некая форма. В этой форме присутсвовало некое текстовое поле - якобы "MultiLine"..  визуально все нормально - выглядит как обычный "MultiLine" (в том смысле что "высокое и широкое" ,  ну обычная TextArea...)   Но почему то при нажатии в текстовом поле Еnter на форме срабатывал постебек. Вместо того чтобы создавать новую строку в текстовом поле - форма отправлялась на сервер...
Первая мысль - блокировать реакцию на Enter... заблокировал . 
Все отлично  - Enter блокируется. Но и  и новая строчка не создается...
Что за фигня...
В других то местах такой проблемы даже и не возникало...
Уже думаю писать более хитрый джавскрипт сценарий. И тут вижу - о чудо!
Текстовому полю размеры указаны как для могосторочного, но блин параметр TextMode="MultiLine" отсутствует. Отсюда и  все проблемы. Устновил TextMode="MultiLine" - все проблемы прошли, и никакя блокировка не понадобилась. На Enter производится создание строчки и никаких постбеков.
Мораль - не копипастить бездумно.