sql >> Databáze >  >> Database Tools >> SSMS

Řízení sítě v SSMS

SSMS mřížka není C++, není to ListView ani DataGrid, nepoužívá nativní ovládací prvky Windows, je to „jen“ vlastní ovládací prvek .NET s názvem GridControl (v Microsoft.SqlServer.Management.UI.Grid jmenný prostor), který patří do sestavení s názvem Microsoft.SqlServer.GridControl.dll.

Najdete jej na různých místech:v GAC , v %ProgramFiles(x86)%\Common Files\Microsoft Shared\SQL Server Developer Tools , v %ProgramFiles(x86)%\Microsoft SQL Server Management Studio 18\Common7\IDE , v souborech sady Visual Studio atd.

Není to redistribuovatelná binární AFAIK, takže ji nemáte posílat, není zdokumentovaná a není to plnohodnotná mřížka jako ostatní. Jak jste však zjistili, je lehký a může být rychlý, stejně rychlý jako váš základní přístup k datům.

Pokud si s tím chcete pohrát, zde je malá ukázka Winforms C# (mřížka 10 000 x 256, což je 2,5 milionu buněk, které se okamžitě otevřou), která ukazuje, jak ji používat:

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.UI.Grid;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private GridControl _control = new GridControl();

        public Form1()
        {
            InitializeComponent();

            for (int i = 0; i < 256; i++)
            {
                _control.AddColumn(new GridColumnInfo { HeaderType = GridColumnHeaderType.Text, IsUserResizable = true });
                _control.SetHeaderInfo(i, "Column " + i, null);
            }

            _control.Dock = DockStyle.Fill;
            _control.GridStorage = new GridStorage();
            Controls.Add(_control);
        }
    }

    // represents a datasource
    public class GridStorage : IGridStorage
    {
        public long EnsureRowsInBuf(long FirstRowIndex, long LastRowIndex)
        {
            return NumRows(); // pagination, dynamic load, virtualization, could happen here
        }

        public void FillControlWithData(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
        {
            // for cell edition
            control.SetCurSelectionAsString(GetCellDataAsString(nRowIndex, nColIndex));
        }

        public string GetCellDataAsString(long nRowIndex, int nColIndex)
        {
            // get cell data
            return nRowIndex + " x " + nColIndex;
        }

        public int IsCellEditable(long nRowIndex, int nColIndex)
        {
            return 1; // 1 means yes, 0 means false
        }

        public long NumRows()
        {
            return 10000;
        }

        public bool SetCellDataFromControl(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
        {
            // when a cell has changed, you're supposed to change your data here
            return true;
        }

        public Bitmap GetCellDataAsBitmap(long nRowIndex, int nColIndex) => throw new NotImplementedException();
        public void GetCellDataForButton(long nRowIndex, int nColIndex, out ButtonCellState state, out Bitmap image, out string buttonLabel) => throw new NotImplementedException();
        public GridCheckBoxState GetCellDataForCheckBox(long nRowIndex, int nColIndex) => throw new NotImplementedException();
    }
}

Tady je to, jak to vypadá. Na slušném počítači můžete rolovat bez jakéhokoli zpomalení.




  1. Připojte se k tunelované DB přes phpMyAdmin

  2. Nepodařilo se vytvořit port ipc; přístup je v MySQL Workbench odepřen

  3. Jak spustit konkrétní dotaz SQL pro každý řádek v tabulce?

  4. SSIS nastavuje sadu výsledků z datového toku do proměnné