'insert'에 해당되는 글 2건

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
Insert는 Table에 Data를 추가하는 Query입니다.

먼저 Insert 구문의 Test를 위해 임시 Table을 생성하도록 하겠습니다.

Create Table #Product(
 Number Smallint,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)


Table 이름 #Product에서 #은 생성하는 Table이 임시 Table이라는 것을 의미합니다.

1. Table의 모든 열에 Data 추가하기

Insert Into #Product
Values(0, '자전거', 50000, GetDate())

#Product Table에 존재하는 모든열에 Values에서 지정한 Data를 추가합니다.


#Product 임시Table에서 Number와 Price는 열 Data형이 정수형이므로 '와 '로 값을 지정하지 않았지만 Name은 nChar형(문자형)이므로 '와 '로 값을 지정하였습니다.

Insert Into #Product
Values('0', '자전거', 50000, GetDate())

위 예제에서는 정수형임에도 불구하고 '0'처럼 문자형으로 데이터를 지정하였습니다. 하지만 0이라는 문자도 정수형으로 변환될 수 있기때문에 정상적으로 처리되지만 되도록이면 Table의 열특성에 맞게끔 지정해 주는것이 성능면에서 더 좋은 선택이 될 것입니다.

참고로 위 Insert문에서 GetDate()는 현재시간(내 Computer가 아닌 Database Server시간 기준)을 출력하는 함수입니다.

위 그림에 보시면 Query로 인해 1개의 행이 영향을 받았음을 알려주고 있습니다. 그럼 어떻게 Data가 추가되었는지 확인해 보도록 하겠습니다.

Select * From #Product


참고로 SQL Server 2008부터는 다중 Insert가 가능하게 되었습니다. 이때는 데이터를 입력하는 괄호사이를 콤마(,)로 구분합니다.

Insert Into #Product Values
(0, '자동차', 300, GETDATE()),
(1, '비행기', 200, GETDATE());

2. 특정 열에만 Data 추가하기

위 Insert문에서 Values를 통해 값을 추가한 경우는 #Product 임시 Table에 존재하는 Number, Name, Price, RegDate 의 모든열에 Data를 추가하여야 하므로 해당 열 순서대로 값을 나열해야 했습니다.

이때 만일 Table에서 전체열이 아닌 특정열에만 Data를 추가하려면 Table명 옆에 추가하고자 하는 열을 지정해 주면 됩니다.

Insert Into #Product(Number, Name, RegDate)
Values(1, '자동차', GetDate())

#Product Table에서 Number, Name, RegDate열에만 지정한 Data를 추가합니다.


이제 Data가 어떤 식으로 처리되었는지 확인해 보도록 하겠습니다.

Select * From #Product


Insert에서 지정되지 않은 열은 자동적으로 Null처리가 됨을 알 수 있습니다.

3. Identity와 Default처리

Insert 하려는 테이블(Table)에 특정 컬럼(Column)이 Identity가 설정되어 있는 경우 해당 컬럼(Column)은 무시할 수 있습니다.

Create Table #Product(
 Number Smallint Identity,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)


Insert Into #Product Values ('자동차', 300, GetDate());


만약 Identity값을 강제적으로 입력하고자 한다면 Identity_Insert 설정을 On으로 바꿔주고 해당 컬럼(Column)을 지정해 데이터를 Insert합니다.


Set Identity_Insert #Product On;

Insert Into #Product(Number, Name, Price, RegDate) Values (10, '자동차', 300, GetDate());


Default의 경우 Default로 설정된 값으로 Insert처리를 수행하고자 한다면 Insert에서 Default를 지정해 주기만 하면 됩니다.


Create Table #Product(
 Number Smallint,
 Name nChar(10) Default '자동차',
 Price Int,
 RegDate DateTime
)


Insert Into #Product Values(100, Default, 300, GetDate());


4. Table을 통한 Data 추가

Insert문은 Values를 통해 단일값만을 지정할 수 있는 것이 아니라 다른 Table의 Data를 원하는 만큼 추가할 수도 있습니다.

Test를 위해 임시Table을 하나더 생성합니다.

Create Table #Product2(
 Number Smallint,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)

위에서 생성한 Table에 Data를 추가합니다.

Insert Into #Product2
Values(3, '비행기', 29900, GetDate())

추가된 Data를 확인합니다.

Select * From #Product2


이제 #Product2 Table에 있는 Data를 #Product Table에 추가하고 그 내용을 확인해 보도록 하겠습니다.

Insert Into #Product
Select * From #Product2

#Product2에 있는 모든 값을 #Product Table에 추가합니다.

Select * From #Product


Insert 구문을 통해 한 Table에서 다른 Table로 Data를 추가하려면 해당 Table의 열 형식이 일치하거나 Insert 구문에 있는 Table의 열 형식이 Select 구문에 있는 열 형식을 포함할 수 있어야 합니다.(포함되어야 한다는 것은 '1' 에서 1이나 1에서 '1'처럼 문자형에서 정수형으로 혹은 정수형에서 문자형으로 상호간 형변환이 가능해야 함을 의미합니다.)

Insert 와 Select를 통해 Data를 추가할 때에도 원하는 열만 추가할 수 있습니다.

Insert Into #Product(Number, Name)
Select Number, Name From #Product2

#Product2의 Number와 Name열의 Data를 #Product Table의 Number과 Name열에 추가합니다.


5. 다른 Table의 Data로 새로운 Table생성하기

Table을 통한 Data 추가는 이미 존재하는 Table에서 Data를 가져와 전혀 새로운 Table을 생성하는 방식으로 활용될 수 있습니다.

Select Number, Name, Price, RegDate
Into #Product3
From #Product

#Product의 Number, Name, Price, RegDate 열 Data를 불러와 #Product3 임시Table을 생성한뒤 불러온 Data를 담습니다.


Table과 Data가 정상적으로 생성되고 추가되었는지 확인해 보도록 하겠습니다.

Select * From #Product3


보시는 것처럼 #Product3 임시 Table이 생성되고 Data또한 정상적으로 추가되었음을 확인할 수 있으며 Into를 통한 Table 생성은 임시Table 뿐만 아니라 정상적인 Table생성도 가능합니다.


0 0
1
블로그 이미지

클리엘