c# - sql server management studio 사용법



SSMS의 그리드 컨트롤 (1)

SSMS (SQL Server Management Studio 2016)에서 쿼리 결과가 초당 깜박 거림 (10k + 행 이상)으로 반환됩니다. 결과 테이블 / 눈금이 완벽하게 부드럽게 스크롤되고 SSMS에서 메모리 공간이 매우 적습니다 (~ 80MB). 이 그리드 / 뷰와 같은 제어 방법은 ListView (~ 200MB, 2-3 초)와 DataGrid (~ 600MB, 8-10 초) 중 하나를 수행합니다. 속도를 최적화하기 위해 모든 시각화 또는 팅크 센트 크롤링을 끄거나 높이를 조정하더라도 SSMS의 그리드보다 훨씬 뒤쪽에서 여전히 성능이 떨어지고 스크롤링 및 GUI 작업이 느립니다.

SSMS에서 사용되는 그리드 컨트롤 뒤에 어떤 것이있어 부드럽게 만들 수 있습니까?


SSMS 그리드는 C ++이 아니며 ListView 또는 DataGrid가 아니며 Windows 네이티브 컨트롤을 사용하지 않으며 " Microsoft.SqlServer.Management.UI.Grid .NET Framework"에 속하는 GridControl ( Microsoft.SqlServer.Management.UI.Grid 네임 스페이스의 경우)이라는 사용자 지정 .NET 컨트롤입니다. Microsoft.SqlServer.GridControl.dll이라는 어셈블리

GAC , %ProgramFiles(x86)%\Common Files\Microsoft Shared\SQL Server Developer Tools , Visual Studio 파일 등 다양한 위치에서 찾을 수 있습니다.

이것은 재배포 가능한 바이너리 AFAIK가 아니기 때문에 발송하지 말고 문서화되지 않았으며 다른 사람들과 마찬가지로 완전한 기능을 갖춘 그리드는 아닙니다. 그러나 알게 되듯이 가벼우 며 기본 데이터 액세스 속도만큼 빠릅니다.

만약 당신이 그것을 가지고 놀고 싶다면, 그것을 사용하는 방법을 보여주는 작은 Winforms C # 샘플 (즉시 열리는 2,500,000 개의 셀인 10000 x 256 격자)이 있습니다 :

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();
    }
}

여기에 그 모습이 있습니다. 적절한 컴퓨터에서 아무런 속도 저하없이 스크롤 할 수 있습니다.





ssms