Удаление нескольких узлов в единственном XQuery для SQL Server

Это на самом деле не очень хорошая идея, если сделать что-то подобное, можно было бы заморозить всю страницу, пока система ждала возврата вашей функции.

5
задан Anton 19 June 2009 в 22:25
поделиться

2 ответа

Хотя удаление немного неудобно, вы можете вместо этого выполнить обновление, чтобы изменить данные, при условии, что ваши данные просты (например, в приведенном вами примере). Следующий запрос в основном разделит две строки XML на таблицы, объединит их, исключит ненулевые (совпадающие) значения и преобразует их обратно в XML:

UPDATE @table 
SET [column] = (
    SELECT p.i.value('.','int') AS c
    FROM [column].nodes('//i') AS p(i)
    OUTER APPLY (
        SELECT x.i.value('.','bigint') AS i
        FROM @parameter.nodes('//i') AS x(i)
        WHERE p.i.value('.','bigint') = x.i.value('.','int')
    ) a
    WHERE a.i IS NULL
    FOR XML PATH(''), TYPE
)
3
ответ дан 14 December 2019 в 13:45
поделиться

Хотя я не могу точно объяснить, почему это происходит, я думаю, что могу показать, как это обойти.

Структура ICONINFO содержит два члена, hbmMask и hbmColor, которые содержат маску и цветные растровые изображения, соответственно, для курсора (официальную документацию см. на странице MSDN для ICONINFO ).

Когда вы вызываете GetIconInfo () для курсора по умолчанию, структура ICONINFO содержит как допустимую маску, так и цветные растровые изображения, как показано ниже (Примечание: красная граница была добавлена, чтобы четко показать границы изображения):

Растровое изображение маски курсора по умолчанию default cursor mask bitmap image

Растровое изображение цвета курсора по умолчанию default cursor color bitmap image

Когда Windows рисует курсор по умолчанию, растровое изображение маски сначала применяется с растровой операцией И, затем растровое изображение цвета применяется с растровой операцией XOR. В результате получается непрозрачный курсор и прозрачный фон.

Однако, когда вы вызываете GetIconInfo () для курсора I-Beam, структура ICONINFO содержит только допустимое растровое изображение маски, а не цветное растровое изображение, как показано ниже (Примечание: снова была добавлена ​​красная граница, чтобы четко показать границы изображения):

Битовая маска курсора I-Beam ibeam cursor mask bitmap image

Согласно документации ICONINFO, курсор I-Beam в этом случае является монохромным курсором. Верхняя половина растрового изображения маски - это маска И, а нижняя половина растрового изображения маски - это растровое изображение XOR. Когда Windows рисует курсор I-Beam, верхняя половина этого растрового изображения сначала рисуется поверх рабочего стола с растровой операцией AND. Затем нижняя половина растрового изображения рисуется поверх растровой операции XOR. На экране курсор будет отображаться как инверсный к содержанию позади него.

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

При этом обновленный метод CaptureCursor () будет обрабатывать как цветные, так и монохромные курсоры, предоставление простого черного изображения курсора, когда курсор является монохромным.

static Bitmap CaptureCursor(ref int x, ref int y)
{
  Win32Stuff.CURSORINFO cursorInfo = new Win32Stuff.CURSORINFO();
  cursorInfo.cbSize = Marshal.SizeOf(cursorInfo);
  if (!Win32Stuff.GetCursorInfo(out cursorInfo))
    return null;

  if (cursorInfo.flags != Win32Stuff.CURSOR_SHOWING)
    return null;

  IntPtr hicon = Win32Stuff.CopyIcon(cursorInfo.hCursor);
  if (hicon == IntPtr.Zero)
    return null;

  Win32Stuff.ICONINFO iconInfo;
  if (!Win32Stuff.GetIconInfo(hicon, out iconInfo))
    return null;

  x = cursorInfo.ptScreenPos.x - ((int)iconInfo.xHotspot);
  y = cursorInfo.ptScreenPos.y - ((int)iconInfo.yHotspot);

  using (Bitmap maskBitmap = Bitmap.FromHbitmap(iconInfo.hbmMask))
  {
    // Is this a monochrome cursor?
    if (maskBitmap.Height == maskBitmap.Width * 2)
    {
      Bitmap resultBitmap = new Bitmap(maskBitmap.Width, maskBitmap.Width);

      Graphics desktopGraphics = Graphics.FromHwnd(Win32Stuff.GetDesktopWindow());
      IntPtr desktopHdc = desktopGraphics.GetHdc();

      IntPtr maskHdc = Win32Stuff.CreateCompatibleDC(desktopHdc);
      IntPtr oldPtr = Win32Stuff.SelectObject(maskHdc, maskBitmap.GetHbitmap());

      using (Graphics resultGraphics = Graphics.FromImage(resultBitmap))
      {
        IntPtr resultHdc = resultGraphics.GetHdc();

        // These two operation will result in a black cursor over a white background.
        // Later in the code, a call to MakeTransparent() will get rid of the white background.
        Win32Stuff.BitBlt(resultHdc, 0, 0, 32, 32, maskHdc, 0, 32, Win32Stuff.TernaryRasterOperations.SRCCOPY);
        Win32Stuff.BitBlt(resultHdc, 0, 0, 32, 32, maskHdc, 0, 0, Win32Stuff.TernaryRasterOperations.SRCINVERT);

        resultGraphics.ReleaseHdc(resultHdc);
      }

      IntPtr newPtr = Win32Stuff.SelectObject(maskHdc, oldPtr);
      Win32Stuff.DeleteObject(newPtr);
      Win32Stuff.DeleteDC(maskHdc);
      desktopGraphics.ReleaseHdc(desktopHdc);

      // Remove the white background from the BitBlt calls,
      // resulting in a black cursor over a transparent background.
      resultBitmap.MakeTransparent(Color.White);
      return resultBitmap;
    }
  }

  Icon icon = Icon.FromHandle(hicon);
  return icon.ToBitmap();
}

Есть некоторые проблемы с кодом, которые могут быть или не быть проблемой.

  1. Проверка монохромного курсора просто проверяет, превышает ли высота в два раза ширину. Хотя это кажется логичным, документация ICONINFO не требует, чтобы этим определялся только монохромный курсор.
3
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: