2019년 4월 12일 금요일

C# - 크로스 스레드 (Control.Invoke)


C# - 크로스 스레드 (Control.Invoke)



매 1초 마다 현재 시각을 표시하는 간단한 시계를 만든다고 합시다.


2009-05-07 오전 10:44:28


보통은 System.Timers.Timer 나 System.Threading.Timer, 혹은 System.Windows.Forms.Timer 를 사용하겠지만, 여기서는 Thread.Sleep 메서드를 이용하여 매 1초 마다 시간을 표시하는 방법을 사용해 보겠습니다.



protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    while (true)
    {
        DisplayDateTime();
        Thread.Sleep(1000);
    }
}

private void DisplayDateTime()
{
    label1.Text = DateTime.Now.ToString();
}


실행하면, 시작하자 마자 바로 화면이 먹통이 되어버리는 걸 알 수 있습니다.
Thread.Sleep 메서드가 현재 메서드(UI가 생성된 메서드)를 잡고 있는 이른바 UI 블로킹이 일어난 것인데요. 이를 해결하기 위해서는 이 부분을 별도의 스레드에서 실행하여야 합니다.



private Thread _thread;
protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    _thread = new Thread(StartNewThread);
    _thread.Start();
}
protected override void OnClosing(CancelEventArgs e)
{
    _thread.Abort();
    base.OnClose(e);
}
private void StartNewThread()
{
    while (true)
    {
        DisplayDateTime();
        Thread.Sleep(1000);
    }
}
private void DisplayDateTime()
{
    label1.Text = DateTime.Now.ToString();
}


1초를 기다린 후 라벨에 시각을 표시하는 로직이 별도의 메서드(StartNewThread)로 빠졌고, 이 메서드는 이제 메인 스레드(UI 스레드)와는 별개의 스레드에서 실행됩니다.
실행을 해 봅시다. 디버깅하지 않고 시작(CTRL + F5)을 실행하면 (운이 좋다면) 문제 없이 시계가 동작하는 걸 볼 수 있지만, 디버깅 시작(F5)을 실행하면 label1.Text = DateTime.Now.ToString();
에서 InvalidOperationException가 발생합니다.


일명 크로스 스레드 예외라고 하는데요.
label1.Text = DateTime.Now.ToString(); 에서 라벨 컨트롤에 접근을 하려고 하는데, 문제는 이 코드가 실행되는 스레드가 라벨 컨트롤이 생성된 스레드(메인 스레드, UI 스레드)가 아니라는 것입니다.

Control.Invoke를 호출하는 방법과 BackgroundWorker를 사용하는 두 가지 방법이 있을텐데, 대부분의 경우에는 BackgroundWorker 가 좋은 선택이 될 것입니다.
스레드 간에 상태를 공유하고, 진행상황을 보고하고, 작업을 중지하는 등 스레드와 관련한 대부분의 작업이 이미 구현되어 있기 때문에 편리하게 사용할 수 있습니다.
다만 BackgroundWorker에는옥의 티랄까, 한 가지 알려진 버그가 있습니다.
이 포스트의 주제가 BackgroundWorker가 아니고, 또 BackgroundWorker에는 곁다리로 슬쩍 이야기할 수 있는 수준 이상의 논점이 많으니까, 이 포스트에서는 Control.Invoke에 대해서만 이야기하도록 하겠습니다.

Control.Invoke를 호출하여 크로스 스레드 문제를 해결하는 코드는 다음과 같습니다.


private void StartNewThread()
{
    while (true)
    {
        if (label1.InvokeRequired)
            label1.Invoke(new DisplayDateTimeHandler(DisplayDateTime));
        else
            DisplayDateTime();
        Thread.Sleep(1000);
    }
}
private delegate void DisplayDateTimeHandler();


먼저 라벨의 InvokeRequired 를 체크하여 Invoke가 필요한지를, 즉 컨트롤에 접근하는 스레드와 컨트롤이 생성된 스레드가  다른 스레드인지를 체크합니다.
굳이 Invoke가 필요하지 않다면 (비록 미미하더라도) 비용이 드는 Invoke를 호출할 필요가 없을 것입니다.
Control.Invoke의 시그니처는 다음과 같습니다.


public Object Invoke(Delegate method, params Object[] args)


첫번째 매개변수가 추상 클래스인 Delegate입니다.
따라서 label1.Invoke(new Delegate(DisplayDateTime)); 과 같이 대리자 인스턴스를 생성할 수가 없습니다.
대신 DisplayDateTimeHandler 라는 대리자 형식을 정의한 후 이 인스턴스를 전달하여야 합니다.
이제 실행(디버깅)을 하여 보면 크로스 스레드 문제 없이 잘 동작합니다.

크로스 스레드 문제가 해결되었으니 여기서 포스트가 끝나야 할 것 같지만, 이 포스트를 서야겠다고 생각한 이유는 사실은 지금 부터 시작 합니다.
Control.Invoke를 호출하는 위 코드를 Action 대리자와 확장 메서드를 사용하여 필드에서 사용할 만한 라이브러리로 만들어 봅시다.

닷넷 프레임웍 2.0에 추가된 두 가지 제네릭 대리자를 사용하면 대부분의 경우에는 대리자를 작성할 필요가 없습니다.
Func과  Action 대리자가 그것인데요. Func은 반환값이 있지만 Action은 반환값이 없다는(void) 점 외에는 동일하며, 두 대리자 모두 매개변수가 0개 ~ 4개인 오버로드가 각각 준비되어 있습니다.
(정확하게 이야기하자면, 매개변수가 0개인 Action 대리자의 형은 void Action() 이므로 제네릭 대리자는 아닙니다.)
그래서 매개 변수가 4개가 넘지 않는 시그니처를 가지는 대리자는 이 두 대리자로 표현할 수가 있는 것입니다.
위 코드에서도 DisplayDateTimeHandler 대리자를 따로 정의하지 않고 제네릭 대리자를 사용할 수 있습니다.
반환값이 없고 매개변수도 없으니까, 제네릭이 아닌 Action 대리자를 사용하면 되겠습니다.


private void StartNewThread()
{
    while (true)
    {
        if (label1.InvokeRequired)
            label1.Invoke(new new Action(DisplayDateTime));
        else
            DisplayDateTime();
        Thread.Sleep(1000);
    }
}


이번에는 확장 메서드를 사용하여 위 코드를 캡슐화 해봅시다.
ControlExtensions라는 static 클래스를 만들고 아래와 같은 확장 메서드를 추가합니다.



public static class ControlExtensions
{
    pubilc static void InvokeIfNeeded(this Control control, Action action)
   {
      if (control.InvokeRequired)
         control.Invoke(action);
     else
         action();
   }
    pubilc static void InvokeIfNeeded<T>(this Control control, Action<T> action, T arg)
   {
      if (control.InvokeRequired)
         control.Invoke(action, arg);
     else
         action(arg);
   }
}

(여기서는 매개변수가 0개 ~ 1개인 오버로드만 보이는데, 2개 ~ 4개인 오버로드도 정의해두면 편리합니다.)
이제 StartNewThread 메서드는 아래와 같이 간단해 집니다.

 

private void StartNewThread()
{
    while (true)
    {
        label1.InvokeIfNeeded(DisplayDateTime);
        Thread.Sleep(1000);
    }
}

람다식이나 익명 메서드를 이용하면 DisplayDateTime 메서드도 따로 정의할 필요가 없어 코드가 좀 더 간단해 집니다.



private void StartNewThread()
{
    while (true)
    {
        label1.InvokeIfNeeded( ()=> label1.Text = DateTime.Now.ToString());
        Thread.Sleep(1000);
    }
}

연습 삼아 코드를 약간 고쳐 봅시다.
DisplayDateTime 메서드를 매개 변수를 가지는 형태로 다음과 같이 수정합니다.



private void DisplayDateTime(DateTime dateTime)
{
    label1.Text = dateTime.ToString();
}


그렇다면 이제 라벨의 Invoke 메서드를 호출할 때 현재 시각을 매개 변수로 넘겨야 합니다.



private void StartNewThread()
{
    while (true)
    {
        label1.InvokeIfNeeded(DisplayDateTime, DateTime.Now);
        Thread.Sleep(1000);
    }
}


ControlExtensions.InvokeIfNeeded 오버로드 중,


pubilc static void InvokeIfNeeded<T>(this Control control, Action<T> action, T arg)


가 호출되는데, 이는 다시 control.Invoke(action, arg); 를 호출합니다.
Control.Invoke의 두 번째 매개변수는 params object[] 이기 때문에, action 대리자의 매개변수의 갯수가 형에 상관없이 호출이 가능합니다.


출처: https://kimgwajang.tistory.com/193





2019년 4월 5일 금요일

C# - 이미지 리스트 박스 (ImageListBox)



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CustomControls
{
/// <summary>
/// 이미지 리스트 박스
/// </summary>
public partial class ImageListBox : ListBox
{
private readonly Font normalFont = new Font("돋움", 9F, (FontStyle)(FontStyle.Regular), GraphicsUnit.Point, ((byte)(129)));
private readonly Font selectFont = new Font("돋움", 9F, (FontStyle)(FontStyle.Bold), GraphicsUnit.Point, ((byte)(129)));
private readonly Color normalColor = Color.FromArgb(72, 72, 72);
private readonly Color selectColor = Color.FromArgb(227, 63, 2);

public ImageListBox()
{
// 이 호출은 Windows.Forms Form 디자이너에 필요합니다.
InitializeComponent();
this.DrawMode = DrawMode.OwnerDrawVariable;
}

protected override void OnPaint(PaintEventArgs pe)
{
// TODO: 사용자 지정 그리기 코드를 여기에 추가합니다.
// 기본 클래스 OnPaint를 호출하고 있습니다.
base.OnPaint(pe);
}

/// <summary>
/// 그려질 Item에 대한 처리를 담당하는 메서드
/// Item이 그려질때마다 이 메서드가 호출이 되게 된다.
/// </summary>
protected override void OnDrawItem(DrawItemEventArgs e)
{
// 만약 Item이 아무것도 없다면 바로 빠져나간다.
if (this.Items.Count == 0)
{
base.OnDrawItem(e);
return;
}

// OptionListItem 객체를 얻어온다
ImageListBoxItem item = (ImageListBoxItem)this.Items[e.Index];

// 비트맵을 제작한다.
Bitmap bmOffscreen = new Bitmap(e.Bounds.Width, e.Bounds.Height);

// 비트맵으로 부터 Graphics객체를 얻어내고
Graphics gfx = Graphics.FromImage(bmOffscreen);

// 현재 그릴 Item이 선택된 상태인지를 얻어온다.
bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

// 시스템 브러쉬를 선언
Brush brBackground = SystemBrushes.Window;

// 그려질 영역을 선언
Rectangle bounds = new Rectangle(0, 0, e.Bounds.Width, e.Bounds.Height);

// Text를 쓸 브러쉬를 선언
//Brush itemTextBrush = SystemBrushes.ControlText;

/*
if(selected)
{
// 만약 현재 그릴 Item이 선택된 Item이라면
// 텍스트는 선택반전된 색을 선택
itemTextBrush = SystemBrushes.HighlightText;

// 배경을 그릴 브러쉬 색은 선택된 배경색의 Alpha값을 128로 주어서 약간 흐릿하게 만든다.
brBackground = new SolidBrush(Color.FromArgb(128, SystemColors.Highlight));

// 배경을 칠하고
gfx.FillRectangle(brBackground, bounds);

// 선택된 포커스 상자 (점선 상자)를 그린다.
e.DrawFocusRectangle();
}
else
{
// 선택된 Item이 아니라면
// 원래의 배경색을 선택
brBackground = new SolidBrush(this.BackColor);

// 배경색을 칠한다.
gfx.FillRectangle(brBackground, bounds);
}

// (20, 5) 위치에 글자를 텍스트 브러쉬로 그린다.
//gfx.DrawString(item.Text, item.Font, itemTextBrush, 20.0F, 5.0F);

// 만약 Icon이 null이 아닌경우에 Icon을 그려준다.
//if (item.Icon != null)
////gfx.DrawIcon(item.Icon, 1, (e.Bounds.Height - item.Icon.Height) / 2);
//gfx.DrawIcon(item.Icon, new Rectangle(1, 2, 16, 16));
*/



// 선택된 Item이 아니라면 원래의 배경색을 선택하여 배경색을 칠한다.
gfx.FillRectangle(new SolidBrush(this.BackColor), bounds);

if(item.Bitmap != null)
{
if(selected)
gfx.DrawString(item.Text, selectFont, new SolidBrush(selectColor), item.Bitmap.Width + 1, GetYLocation(item.Bitmap.Width));
else
gfx.DrawString(item.Text, normalFont, new SolidBrush(normalColor), item.Bitmap.Width + 1, GetYLocation(item.Bitmap.Width));

gfx.DrawImage(item.Bitmap, new Rectangle(1, 2, item.Bitmap.Width, item.Bitmap.Height));
}
else if(item.Icon != null)
{
if(selected)
gfx.DrawString(item.Text, selectFont, new SolidBrush(selectColor), item.Icon.Width + 1, GetYLocation(item.Icon.Width));
else
gfx.DrawString(item.Text, normalFont, new SolidBrush(normalColor), item.Icon.Width + 1, GetYLocation(item.Icon.Width));
gfx.DrawIcon(item.Icon, new Rectangle(1, 2, item.Icon.Width, item.Icon.Height));
}

// 그려진 비트맵을 그리고자 하는 위치에 사이징 하지 않고 그대로 그려준다.
e.Graphics.DrawImageUnscaled(bmOffscreen, e.Bounds.X, e.Bounds.Y);

bmOffscreen.Dispose();
}

private int GetYLocation(int height)
{
if(1 <= height && height <= 19)
return 5;
else if(20 <= height && height <= 29)
return 8;
else if(30 <= height && height <= 39)
return 11;
else if(40 <= height)
return 13;
else
return 0;
}
}


public class ImageListBoxItem
{
private Icon icon = null;
private Bitmap bitmap = null;
private string text = "";

public ImageListBoxItem(string text)
{
this.Text = text;
}

public ImageListBoxItem(string text, Icon icon) : this(text)
{
this.Icon = icon;
}

public ImageListBoxItem(string text, Bitmap bitmap) : this(text)
{
this.Bitmap = bitmap;
}

/// <summary>
/// 보여줄 아이콘
/// </summary>
public Icon Icon
{
get { return this.icon; }
set { this.icon = value; }
}

/// <summary>
/// 보여줄 아이콘
/// </summary>
public Bitmap Bitmap
{
get { return this.bitmap; }
set { this.bitmap = value; }
}

/// <summary>
/// 보여줄 텍스트
/// </summary>
public string Text
{
get { return this.text; }
set { this.text = value; }
}
}

}


C# - MaskedTextBox 디자인 및 효과 적용



using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace CustomControls
{
/// <summary>
/// MaskedTextBox 디자인 및 효과 적용
/// </summary>
/// <작성자>김하덕</작성자>
/// <작성일>2008-09-02 ~ 2008-09-04</작성일>
public partial class MaskTBoxStyle : Control
{
private MaskedTextBox maskTBox = new MaskedTextBox();

private int _borderWidth = 0;
private int _borderWidthMax = 1;
private int _borderWidthMin = 0;
private string _mask = "99999";
private Type _validatingType = typeof(int);
private Color _borderColor = Color.Black;
private int _width_MBox = 100;
private HorizontalAlignment _textAlign = HorizontalAlignment.Center;
private Font _font = new System.Drawing.Font("Arial", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
private bool _isFocus = false;

public int BorderWidthMax
{
get { return _borderWidthMax; }
set
{
if (value < 1)
_borderWidthMax = 1;
else
{
_borderWidthMax = value;
this.maskTBox.Location = new System.Drawing.Point(_borderWidthMax, _borderWidthMax);
_borderWidth = _borderWidthMax;
MaskTBoxResize();
}
}
}

public int BorderWidthMin
{
get { return _borderWidthMin; }
set
{
if (value < 0)
_borderWidthMin = 0;
else
{
_borderWidthMin = value;
_borderWidth = _borderWidthMin;
MaskTBoxResize();
}
}
}

public Color BorderColor
{
get { return _borderColor; }
set { _borderColor = value; }
}

public new Font Font
{
get { return _font; }
set
{
_font = value;
this.maskTBox.Font = value;
MaskTBoxResize();
}
}

public string Mask
{
get { return _mask; }
set
{
_mask = value;
this.maskTBox.Mask = value;
}
}

public Type ValidatingType
{
get { return _validatingType; }
set
{
_validatingType = value;
this.maskTBox.ValidatingType = value;
}
}

public int Width_MBox
{
get { return _width_MBox; }
set
{
_width_MBox = value;
this.maskTBox.Width = value;
MaskTBoxResize();
}
}

public HorizontalAlignment TextAlign
{
get { return _textAlign; }
set
{
_textAlign = value;
this.maskTBox.TextAlign = value;
}
}

private void MaskTBoxResize()
{
this.Width = this.maskTBox.Width + (_borderWidthMax * 2);
this.Height = this.maskTBox.Height + (_borderWidthMax * 2);
}

public MaskTBoxStyle()
{
SetMaskTBoxStyle(_font, _mask, _validatingType, _borderWidth, _borderColor, _width_MBox, _textAlign, _borderWidthMax, _borderWidthMin);
}

public MaskTBoxStyle(Font font, string mask, Type validatingType, int borderWidth, Color borderColor, int width_MBox, HorizontalAlignment textAlign, int borderWidthMax, int borderWidthMin)
{
SetMaskTBoxStyle(font, mask, validatingType, borderWidth, borderColor, width_MBox, textAlign, borderWidthMax, borderWidthMin);
}

private void SetMaskTBoxStyle(Font font, string mask, Type validatingType, int borderWidth, Color borderColor, int width_MBox, HorizontalAlignment textAlign, int borderWidthMax, int borderWidthMin)
{
InitializeComponent();

//
// maskTBox
//
this.maskTBox.Top = 0;
this.maskTBox.Left = 0;
this.maskTBox.BorderStyle = BorderStyle.None;
this.maskTBox.PromptChar = ' ';

//
// MaskTBoxStyle
//
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = System.Drawing.Color.Transparent;
this.Font = font;
this.Mask = mask;
this.ValidatingType = validatingType;
this.BorderWidthMax = borderWidthMax;
this.BorderWidthMin = borderWidthMin;
this.BorderColor = borderColor;
this.Width_MBox = width_MBox;
this.TextAlign = textAlign;

this.Controls.Add(maskTBox);

MaskedTextBoxEventHandler();
}

public string TextValue
{
get { return this.maskTBox.Text.Trim(); }
set { this.maskTBox.Text = value; }
}

private void MaskedTextBoxEventHandler()
{
this.maskTBox.TextChanged += new System.EventHandler(this.OnTextChanged);
this.maskTBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.OnTextKeyPress);
this.maskTBox.MouseHover += new System.EventHandler(this.OnMouseHover);
this.maskTBox.MouseLeave += new System.EventHandler(this.OnMouseLeave);
this.maskTBox.Enter += new System.EventHandler(this.OnEnter);
this.maskTBox.Leave += new System.EventHandler(this.OnLeave);
}

private void OnTextKeyPress(object sender, KeyPressEventArgs e)
{
if(!(Char.IsNumber(e.KeyChar)))
{
if((e.KeyChar == (char)Keys.Space) || (e.KeyChar == (char)Keys.Back))
e.Handled = false;
else
e.Handled = true;
}

/*
//if(e.KeyChar == 32) // 스페이스
if(e.KeyChar == (char)Keys.Space)
{
e.Handled = true;
}
else
{
base.OnKeyPress(e);
}
*/
}

private void OnMouseHover(object sender, EventArgs e)
{
this.BorderColor = _borderColor;
this.BorderWidthMax = _borderWidthMax;
Refresh();

base.OnMouseHover(e);
}

private void OnMouseLeave(object sender, EventArgs e)
{
if(!this._isFocus)
{
this.BorderColor = _borderColor;
this.BorderWidthMin = _borderWidthMin;
Refresh();
}

base.OnMouseLeave(e);
}

private void OnEnter(object sender, EventArgs e)
{
this._isFocus = true;

this.BorderColor = _borderColor;
this.BorderWidthMax = _borderWidthMax;
Refresh();

base.OnEnter(e);
}

private void OnLeave(object sender, EventArgs e)
{
this._isFocus = false;

this.BorderColor = _borderColor;
this.BorderWidthMin = _borderWidthMin;
Refresh();

base.OnLeave(e);
}

private void OnTextChanged(object sender, EventArgs e)
{
base.OnTextChanged(e);
}

protected override void OnPaint(PaintEventArgs e)
{
int j = 0;
for(int i = 1; i <= _borderWidth; i++)
{
e.Graphics.DrawRectangle(new Pen(_borderColor), (this.maskTBox.Top - i), (this.maskTBox.Left - i), (this.maskTBox.Width + (i + j)), (this.maskTBox.Height + (i + j)));
j++;
}

base.OnPaint(e);
}


}
}


DB - SQL Interview Questions & Answers




1. What is DBMS?
A Database Management System (DBMS) is a program that controls creation, maintenance and use of a database. DBMS can be termed as File Manager that manages data in a database rather than saving it in file systems.
2. What is RDBMS?
RDBMS stands for Relational Database Management System. RDBMS store the data into the collection of tables, which is related by common fields between the columns of the table. It also provides relational operators to manipulate the data stored into the tables.
Example: SQL Server.
3. What is SQL?
SQL stands for Structured Query Language , and it is used to communicate with the Database. This is a standard language used to perform tasks such as retrieval, updation, insertion and deletion of data from a database.
Standard SQL Commands are Select.
4. What is a Database?
Database is nothing but an organized form of data for easy access, storing, retrieval and managing of data. This is also known as structured form of data which can be accessed in many ways.
Example: School Management Database, Bank Management Database.
5. What are tables and Fields?
A table is a set of data that are organized in a model with Columns and Rows. Columns can be categorized as vertical, and Rows are horizontal. A table has specified number of column called fields but can have any number of rows which is called record.
Example:.
Table: Employee.
Field: Emp ID, Emp Name, Date of Birth.
Data: 201456, David, 11/15/1960.
6. What is a primary key?
A primary key is a combination of fields which uniquely specify a row. This is a special kind of unique key, and it has implicit NOT NULL constraint. It means, Primary key values cannot be NULL.
7. What is a unique key?
A Unique key constraint uniquely identified each record in the database. This provides uniqueness for the column or set of columns.
A Primary key constraint has automatic unique constraint defined on it. But not, in the case of Unique Key.
There can be many unique constraint defined per table, but only one Primary key constraint defined per table.
8. What is a foreign key?
A foreign key is one table which can be related to the primary key of another table. Relationship needs to be created between two tables by referencing foreign key with the primary key of another table.
9. What is a join?
This is a keyword used to query data from more tables based on the relationship between the fields of the tables. Keys play a major role when JOINs are used.
10. What are the types of join and explain each?
There are various types of join which can be used to retrieve data and it depends on the relationship between tables.
  • Inner Join.
Inner join return rows when there is at least one match of rows between the tables.
  • Right Join.
Right join return rows which are common between the tables and all rows of Right hand side table. Simply, it returns all the rows from the right hand side table even though there are no matches in the left hand side table.
  • Left Join.
Left join return rows which are common between the tables and all rows of Left hand side table. Simply, it returns all the rows from Left hand side table even though there are no matches in the Right hand side table.
  • Full Join.
Full join return rows when there are matching rows in any one of the tables. This means, it returns all the rows from the left hand side table and all the rows from the right hand side table.
11. What is normalization?
Normalization is the process of minimizing redundancy and dependency by organizing fields and table of a database. The main aim of Normalization is to add, delete or modify field that can be made in a single table.
12. What is Denormalization.
DeNormalization is a technique used to access the data from higher to lower normal forms of database. It is also process of introducing redundancy into a table by incorporating data from the related tables.
13. What are all the different normalizations?
The normal forms can be divided into 5 forms, and they are explained below -.
  • First Normal Form (1NF):.
This should remove all the duplicate columns from the table. Creation of tables for the related data and identification of unique columns.
  • Second Normal Form (2NF):.
Meeting all requirements of the first normal form. Placing the subsets of data in separate tables and Creation of relationships between the tables using primary keys.
  • Third Normal Form (3NF):.
This should meet all requirements of 2NF. Removing the columns which are not dependent on primary key constraints.
  • Fourth Normal Form (3NF):.
Meeting all the requirements of third normal form and it should not have multi- valued dependencies.
14. What is a View?
A view is a virtual table which consists of a subset of data contained in a table. Views are not virtually present, and it takes less space to store. View can have data of one or more tables combined, and it is depending on the relationship.
15. What is an Index?
An index is performance tuning method of allowing faster retrieval of records from the table. An index creates an entry for each value and it will be faster to retrieve data.
16. What are all the different types of indexes?
There are three types of indexes -.
  • Unique Index.
This indexing does not allow the field to have duplicate values if the column is unique indexed. Unique index can be applied automatically when primary key is defined.
  • Clustered Index.
This type of index reorders the physical order of the table and search based on the key values. Each table can have only one clustered index.
  • NonClustered Index.
NonClustered Index does not alter the physical order of the table and maintains logical order of data. Each table can have 999 nonclustered indexes.
17. What is a Cursor?
A database Cursor is a control which enables traversal over the rows or records in the table. This can be viewed as a pointer to one row in a set of rows. Cursor is very much useful for traversing such as retrieval, addition and removal of database records.
18. What is a relationship and what are they?
Database Relationship is defined as the connection between the tables in a database. There are various data basing relationships, and they are as follows:.
  • One to One Relationship.
  • One to Many Relationship.
  • Many to One Relationship.
  • Self-Referencing Relationship.
19. What is a query?
A DB query is a code written in order to get the information back from the database. Query can be designed in such a way that it matched with our expectation of the result set. Simply, a question to the Database.
20. What is subquery?
A subquery is a query within another query. The outer query is called as main query, and inner query is called subquery. SubQuery is always executed first, and the result of subquery is passed on to the main query.
21. What are the types of subquery?
There are two types of subquery – Correlated and Non-Correlated.
A correlated subquery cannot be considered as independent query, but it can refer the column in a table listed in the FROM the list of the main query.
A Non-Correlated sub query can be considered as independent query and the output of subquery are substituted in the main query.
22. What is a stored procedure?
Stored Procedure is a function consists of many SQL statement to access the database system. Several SQL statements are consolidated into a stored procedure and execute them whenever and wherever required.
23. What is a trigger?
A DB trigger is a code or programs that automatically execute with response to some event on a table or view in a database. Mainly, trigger helps to maintain the integrity of the database.
Example: When a new student is added to the student database, new records should be created in the related tables like Exam, Score and Attendance tables.
24. What is the difference between DELETE and TRUNCATE commands?
DELETE command is used to remove rows from the table, and WHERE clause can be used for conditional set of parameters. Commit and Rollback can be performed after delete statement.
TRUNCATE removes all rows from the table. Truncate operation cannot be rolled back.
25. What are local and global variables and their differences?
Local variables are the variables which can be used or exist inside the function. They are not known to the other functions and those variables cannot be referred or used. Variables can be created whenever that function is called.
Global variables are the variables which can be used or exist throughout the program. Same variable declared in global cannot be used in functions. Global variables cannot be created whenever that function is called.
26. What is a constraint?
Constraint can be used to specify the limit on the data type of table. Constraint can be specified while creating or altering the table statement. Sample of constraint are.
  • NOT NULL.
  • CHECK.
  • DEFAULT.
  • UNIQUE.
  • PRIMARY KEY.
  • FOREIGN KEY.
27. What is data Integrity?
Data Integrity defines the accuracy and consistency of data stored in a database. It can also define integrity constraints to enforce business rules on the data when it is entered into the application or database.
28. What is Auto Increment?
Auto increment keyword allows the user to create a unique number to be generated when a new record is inserted into the table. AUTO INCREMENT keyword can be used in Oracle and IDENTITY keyword can be used in SQL SERVER.
Mostly this keyword can be used whenever PRIMARY KEY is used.
29. What is the difference between Cluster and Non-Cluster Index?
Clustered index is used for easy retrieval of data from the database by altering the way that the records are stored. Database sorts out rows by the column which is set to be clustered index.
A nonclustered index does not alter the way it was stored but creates a complete separate object within the table. It point back to the original table rows after searching.
30. What is Datawarehouse?
Datawarehouse is a central repository of data from multiple sources of information. Those data are consolidated, transformed and made available for the mining and online processing. Warehouse data have a subset of data called Data Marts.
31. What is Self-Join?
Self-join is set to be query used to compare to itself. This is used to compare values in a column with other values in the same column in the same table. ALIAS ES can be used for the same table comparison.
32. What is Cross-Join?
Cross join defines as Cartesian product where number of rows in the first table multiplied by number of rows in the second table. If suppose, WHERE clause is used in cross join then the query will work like an INNER JOIN.
33. What is user defined functions?
User defined functions are the functions written to use that logic whenever required. It is not necessary to write the same logic several times. Instead, function can be called or executed whenever needed.
34. What are all types of user defined functions?
Three types of user defined functions are.
  • Scalar Functions.
  • Inline Table valued functions.
  • Multi statement valued functions.
Scalar returns unit, variant defined the return clause. Other two types return table as a return.
35. What is collation?
Collation is defined as set of rules that determine how character data can be sorted and compared. This can be used to compare A and, other language characters and also depends on the width of the characters.
ASCII value can be used to compare these character data.
36. What are all different types of collation sensitivity?
Following are different types of collation sensitivity -.
  • Case Sensitivity – A and a and B and b.
  • Accent Sensitivity.
  • Kana Sensitivity – Japanese Kana characters.
  • Width Sensitivity – Single byte character and double byte character.
37. Advantages and Disadvantages of Stored Procedure?
Stored procedure can be used as a modular programming – means create once, store and call for several times whenever required. This supports faster execution instead of executing multiple queries. This reduces network traffic and provides better security to the data.
Disadvantage is that it can be executed only in the Database and utilizes more memory in the database server.
38. What is Online Transaction Processing (OLTP)?
Online Transaction Processing (OLTP) manages transaction based applications which can be used for data entry, data retrieval and data processing. OLTP makes data management simple and efficient. Unlike OLAP systems goal of OLTP systems is serving real-time transactions.
Example – Bank Transactions on a daily basis.
39. What is CLAUSE?
SQL clause is defined to limit the result set by providing condition to the query. This usually filters some rows from the whole set of records.
Example – Query that has WHERE condition
Query that has HAVING condition.
40. What is recursive stored procedure?
A stored procedure which calls by itself until it reaches some boundary condition. This recursive function or procedure helps programmers to use the same set of code any number of times.
41. What is Union, minus and Interact commands?
UNION operator is used to combine the results of two tables, and it eliminates duplicate rows from the tables.
MINUS operator is used to return rows from the first query but not from the second query. Matching records of first and second query and other rows from the first query will be displayed as a result set.
INTERSECT operator is used to return rows returned by both the queries.
42. What is an ALIAS command?
ALIAS name can be given to a table or column. This alias name can be referred in WHERE clause to identify the table or column.
Example-.
Select st.StudentID, Ex.Result from student st, Exam as Ex where st.studentID = Ex. StudentID
Here, st refers to alias name for student table and Ex refers to alias name for exam table.
43. What is the difference between TRUNCATE and DROP statements?
TRUNCATE removes all the rows from the table, and it cannot be rolled back. DROP command removes a table from the database and operation cannot be rolled back.
44. What are aggregate and scalar functions?
Aggregate functions are used to evaluate mathematical calculation and return single values. This can be calculated from the columns in a table. Scalar functions return a single value based on the input value.
Example -.
Aggregate – max(), count - Calculated with respect to numeric.
Scalar – UCASE(), NOW() – Calculated with respect to strings.
45. How can you create an empty table from an existing table?
Example will be -.
Select * into studentcopy from student where 1=2
Here, we are copying student table to another table with the same structure with no rows copied.
46. How to fetch common records from two tables?
Common records result set can be achieved by -.
Select studentID from student. <strong>INTERSECT </strong> Select StudentID from Exam
47. How to fetch alternate records from a table?
Records can be fetched for both Odd and Even row numbers -.
To display even numbers-.
Select studentId from (Select rowno, studentId from student) where mod(rowno,2)=0
To display odd numbers-.
Select studentId from (Select rowno, studentId from student) where mod(rowno,2)=1
from (Select rowno, studentId from student) where mod(rowno,2)=1.[/sql]
48. How to select unique records from a table?
Select unique records from a table by using DISTINCT keyword.
Select DISTINCT StudentID, StudentName from Student.
49. What is the command used to fetch first 5 characters of the string?
There are many ways to fetch first 5 characters of the string -.
Select SUBSTRING(StudentName,1,5) as studentname from student
Select RIGHT(Studentname,5) as studentname from student
50. Which operator is used in query for pattern matching?
LIKE operator is used for pattern matching, and it can be used as -.
  1. % - Matches zero or more characters.
  2. _(Underscore) – Matching exactly one character.
Example -.
Select * from Student where studentname like 'a%'
Select * from Student where studentname like 'ami_'



javascript - SQL 예약어 제거

  <script language="javascript"> //특수문자, 특정문자열(sql예약어) 제거 function checkSearchedWord(obj){ obj.value = obj.value+&quo...