'delete'에 해당되는 글 3건

Programming/.NET
ADO.NET 은 .NET Framework 1.0 부터 포함된 핵심 컴포넌트에 해당하며 오늘날 데이터에 접근할 수 있는 다양한 방법을 제시함으로써 근본적으로 데이터를 다루기 위한 여러 기능을 제공하고 있습니다.

ADO.NET 이전의 ADO 는 데이터베이스로부터 지속적으로 데이터 연결을 유지한 상태에서 필요한 데이터를 다루어야 했는데 연결상태가 계속해서 유지되어야 한다는 면은 비효휼적인 면을 드러냈고 곧 비연결상태에서도 데이터를 다룰 수 있어야 한다는 요구가 제시되었습니다.

비연결의 근본적인 동작방식은 데이터를 특정 컬렉션에 채워넣고 DB와의 연결을 끊은상태에서 컬렉션에 채워진 데이터를 다루는 것입니다. ADO.NET 의 DataSet 이 바로 그러한 역활을 수행하는데 컬렉션에 채워진 데이터는 데이터베이스와는 분리된 상태이지만 데이터내용은 물론 모든 테이블정보(열, 행, 릴레이션관한 것등)를 완벽히 유지하면서 데이터를 다룰 수 있습니다.

사실 이게 중요한데 이전 ADO 에서는 데이터를 담아두기 위한 단독적인 테이블이 필요했으며 이것은 데이터베이스의 테이블정보를 전혀 반영하지 않은 것이었습니다.

또한 ADO.NET 은 통합된 프로그래밍 모델로서 서버나 클라이언트 모두 같은 방법으로 데이터를 다룰 수 있어서 기존 ADO 보다는 좀더 나은 생산성을 기대할 수 있습니다.

 Select

데이터 소스를 연결하고 나서 단순히 데이터를 읽어오기만 하는 경우라면 간단히 DataReader 클래스를 사용할 수 있습니다.
public List<string> GetPersonPhone()
{
    string strCmd = "Select * From [Person].[PersonPhone];";
 
    SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=AdventureWorks2012;User ID=sa;Password=123");
    SqlCommand cmd = new SqlCommand(strCmd, conn);
    conn.Open();
 
    List<string> rtn = new List<string>();                
            
    SqlDataReader SqlReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);                
 
    while (SqlReader.Read())
        rtn.Add(SqlReader["PhoneNumber"].ToString());
 
    return rtn;
}
▶<코드 1-1>

<코드 1-1>은 AdventureWorks2012 DB의 Person.PersonPhone 테이블의 내용을 가져와 그 중 PhoneNumbe
r 컬럼의 데이터를 List 에 담고 반환하는 예제입니다.

DB 서버의 연결을 위해 SqlConnection 클래스의 인스턴스를 생성해 연결문자열을 지정하고 뒤이어 SqlCom
mand 객체를 생성하면서 데이터를 가져오기 위한 쿼리문과 SqlConnection 객체를 전달합니다. 여기까지 하고 나면 DB연결준비는 끝난것으로 SqlConnection 객체의 Open 함수를 호출하여 지정한 DB를 열도록 합니다.

SqlCommand 클래스가 쿼리문을 실행하는 클래스로서 ExecuteReader 메소드를 호출해 쿼리를 전달하고 반환된 SqlDataReader 객체의 Read() 메소드를 순환호출함으로서 실제 내용을 읽어오도록 합니다. 그리고 모든 데이터를 배열이나 리스트등에 담게 되면 DB와의 연결은 자동으로 닫히게 됩니다.

 Insert

Insert 는 Select 처리가 별반 다르지 않습니다. 쿼리문을 Insert 에 맞게 수정하고 Select 때의 ExecuteReader 메소드 대신에 ExecuteNonQuery 메소드를 호출하는 것이 전부입니다.
public void AddPersonPhone()
{
    string strCmd = "Insert Into [Person].[PersonPhone] Values (20777, '1 (11) 500 555-1212', 1, GETDATE());";
 
    SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=AdventureWorks2012;User ID=sa;Password=123");
    SqlCommand cmd = new SqlCommand(strCmd, conn);
    conn.Open();
 
    cmd.ExecuteNonQuery();
    conn.Close();
}
▶<코드 2-1>

<코드 2-1> 에서는 Select 때와는 달리 데이터를 담을 수 있는 배열등이 필요없으며 단지 DB 를 Open 한 이후 쿼리를 실행하는 ExecuteNonQuery 메소드를 바로 호출합니다. 다만 필요한 작업을 수행한 이 후 Close 메소드를 호출하여 DB 연결을 닫아주도록 합니다.

 Update

Table 의 Update 는 <코드 2-1> Insert 작업에서 쿼리만 Update 구문으로 바꿔주면 됩니다. 쉽죠?
public void ModifyPersonPhone()
{
    string strCmd = "Update [Person].[PersonPhone] Set PhoneNumber = '000-000-0000' Where BusinessEntityID = 20777;";
 
    SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=AdventureWorks2012;User ID=sa;Password=123");
    SqlCommand cmd = new SqlCommand(strCmd, conn);
    conn.Open();
 
    cmd.ExecuteNonQuery();
    conn.Close();
}
▶<코드 3-1>

참고로 ExecuteNonQuery 함수는 쿼리 실행에 적용된 Table 의 Row 수를 반환합니다. 따라서 만일 Update 로 인해 변경된 Row 수를 알아야 한다면 ExecuteNonQuery 함수호출시 다음과 같은 방법으로 결과값을 가져오면 됩니다.
int updateRow = cmd.ExecuteNonQuery();
이러한 처리 방법은 Insert 나 Delete 등에도 똑같이 적용될 수 있습니다.

 Delete

Delete 는 Insert 나 Update 와 비교해 쿼리문만 다를 뿐 모든처리과정이 같습니다.

public void delPersonPhone()
{
    string strCmd = "Delete From Person.PersonPhone Where BusinessEntityID = 20777;";
 
    SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=AdventureWorks2012;User ID=sa;Password=123");
    SqlCommand cmd = new SqlCommand(strCmd, conn);
    conn.Open();
 
    int updateRow = cmd.ExecuteNonQuery();
    conn.Close();
}
3 0
Programming/Microsoft SQL Server
Table의 Data를 삭제하기 위해서는 Delete구문을 사용합니다. Delete는 사용방법에 관해서는 Select나 Insert, Update보다 훨씬 쉬운 DML구문에 해당합니다.
그 만큼 너무나도 삭제가 간단하므로 Delete문을 사용하기전 Transaction을 걸어놓는등의 주의가 꼭 필요합니다.

참고:
(1) DML(Data Manipulation Language) : Table의 Data를 조회하거나, 변경, 삭제 하는 SQL구문
(2) Transaction : Table의 Data를 변경하거나 혹은 삭제했을때 그것을 당장 반영하지 않고 대기상태에 머물게 합니다. 이 후 따로 확인명령이 있어야지만 변경된 작업을 반영하는 Data관리 개념입니다.

1. 테이블 전체 행 지우기

Delete From HumanResources.EmployeeDepartmentHistory

HumanResources.EmployeeDepartmentHistory Table의 모든 행을 삭제합니다.



2. 원하는 행만 삭제하기

Delete문도 Select나 Update처럼 Where조건을 지정해 원하는 행만 삭제할 수 있습니다.

Delete From HumanResources.EmployeePayHistory
Where BusinessEntityID = 290

HumanResources.EmployeePayHistory Table에서 BusinessEntityID가 290인 행을 삭제합니다.


3. 중복행 삭제하기

Table에 중복되는 Data가 많을 경우 중복부분을 삭제해야 하는 경우가 종종 발생하곤 합니다. 이때는 Select문에서 보았던 Top절을 이용해 삭제하는 방법을 많이 쓰고 있습니다.

먼저 중복행 삭제를 위해 간단한 Table 하나를 살펴보겠습니다.

Select *
From Sales.SalesTerritoryHistory
Where TerritoryID = 1

Sales.SalesTerritoryHistory Table에서 TerritoryID가 1인것만 모두 조회합니다.


이중에서 TerritoryID가 1인것 하나만 남겨두고 상위 2개는 모두 삭제해 보겠습니다.

Delete Top(2) Sales.SalesTerritoryHistory
Where TerritoryID = 1

Sales.SalesTerritoryHistory Table에서 상위 TerritoryID가 1인것 2행을 삭제합니다.


Delete는 테이블에 특정한 처리를 행하지 않기 때문에 비교적 빠른 속도로 Data를 삭제하지만 이것도 너무 많은 경우 그 만큼 시간이 오래 걸릴 수 있습니다. 삭제하면서 트랜잭션 로그를 기록하기 때문인데요.

이럴때는 Truncate 구문을 사용하면 시간을 단축 시킬 수 있습니다. 예를 들어 대상 Table이 Sales.SalesTerritoryHistory일 경우 다음과 같이 작성하면 됩니다.

Truncate Table Sales.SalesTerritoryHistory

Truncate는 Data삭제할 때 실제 Data를 지우지 않고 IAM(Index Allocation Map)의 정보만을 삭제하며 트랜잭션 로그를 생성하지 않기에 삭제시간을 단축시킬 수 있는 것입니다. 이것은 마치 책의 실제내용이 아닌 색인정보만을 지워서 실제 책안에 내용이 아무것도 없는것처럼 하는것과 처리가 비슷하다고 보시면 됩니다.


'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Update  (0) 2010.09.01
[SQL] Replicate로 문자열 채워넣기  (0) 2010.08.26
[SQL] Delete  (0) 2010.08.25
[SQL] 임시 Table과 변수 Table  (2) 2010.08.24
[SQL] 구성함수(전역변수)  (0) 2010.08.20
[SQL] 트랜잭션(Transaction)  (0) 2010.08.19
0 0
Programming/C C++
C++에서 Memory를 동적으로 확보하려면 new와 delete연산자를 사용해야 합니다.(함수가 아닙니다. 고로 별도의 Header File선언도 필요하지 않습니다.)

#include <iostream.h>

main()
{
  int *i;
 
  i = new int;
 
  *i = 3200;
 
  cout << "pointer i의 값 : " << *i << endl;
 
  delete i;
 
  return 0;
}


i = new int;를 통해 int형 Data를 담을 수 있는(4Byte) Memory를 확보하고 해당 int형 주소를 Pointer i에 전달합니다. 이렇게 확보된 Memory에 *i = 3200; 으로 3200이라는 값을 저장하고 그 값을 확인하고 있습니다.

확보된 Memory 공간을 활용한 후 더이상 필요없어지면 delete 연산자를 통해 Memory사용을 해제합니다.


#include <iostream.h>

main()
{
  int *i;
  int j;
 
  i = new int[10];
 
  for (j = 0; j < 9; j++)
    i[j] = j;
 
  for (j = 0; j < 9; j++)
    cout << "i배열 j[" << j <<"]의 값 " << i[j] << endl;
 
  delete [] i;
 
  return 0;
}


예제는 int형 배열 10개의 Memory공간을 확보하고 그 시작주소를 i Pointer에 전달하고 있습니다. 첫번째 for문을 통해 i배열에 값을 넣고 두번째 for 문에서 해당 배열의 값을 확인하고 있습니다.

마지막으로 delete를 통해 Memory를 해제하는데 다만 배열의 경우 '[]' 구문을 추가하여야 합니다.


이때 만일 일차원이 아닌 다차원배열을 동적확보하고자 할 경우에는 다음과 같이 처리해야 합니다.

char (*s) [20];
s = new char[10][20];

즉, 원하는 배열크기를 가지는 Pointer를 먼저 선언하고 그 배열크기에 맞는 다차원배열을 선언해야 하는 것입니다. 동적 Memory할당은 Pointer의 선언과 할당을 별도로 해도 되고 아니면 선언과 동시에 수행할 수도 있습니다.

int *i = new int;

단일크기 확보

char *c = new char[10];

배열크기 확보

char (*s) [20] = new char[10][20];

다차원 배열크기 확보

'Programming > C C++' 카테고리의 다른 글

[C, C++] 표준 Library 함수 - 문자열 비교 함수  (0) 2010.04.22
[C, C++] 문자와 문자열 처리(cin Object)  (0) 2010.04.16
[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
0 0
1
블로그 이미지

클리엘