'.NET/ADO.NET'에 해당되는 글 14건

  1. 2010.08.06 특정 행 복사하기
  2. 2010.08.04 내장 프로시저
  3. 2010.07.26 회원탈퇴시 모든정보 날리기
  4. 2010.07.12 다른컴퓨터로 DB 복사
  5. 2010.07.10 내장 프로시저(사용법)
  6. 2010.06.18 DB에 이미지 저장 / 로드 하기
  7. 2010.05.28 DB모델링
  8. 2010.04.02 SqlDataAdapter
  9. 2010.04.02 DataSet
  10. 2010.04.02 DataView

 행을 복사하기 위해서는

Select 와 Insert 문을 합쳐서 사용하면 된다.

예를 들어

insert into CROPS (Crop_Number ,Crop_Name, Mem_Num)
(select Crop_Number,Crop_Name, Mem_Num  from CROPS where @CROP_NUMBER = Number)

이렇게 하면 되는데 서브쿼리로 들어가있는 Select에 보면 where 절이 있는데 이건 where 조건에 해당하는 행을 복사 하겠다는 것이다. 위와 같이 기본키만 다른 똑같은 행을 만들 수도있고 특정 값만 변경시켜서 넣고 싶을때는

insert into CROPS (Crop_Number ,Crop_Name, Mem_Num)
(select Crop_Number,@NEW_CROP_NAME, @MEM_NUM  from CROPS where @CROP_NUMBER = Number)
이와 같이 @스칼라 변수에 어떠한 값을 넣은 후에 특정 열만 복사하는 방법도 있다.


그리고...
Insert into 에서 특정 열을 지정해주지 않으면 이런 오류가 날 수 있다.




아래 글은  http://dualist.tistory.com/159 여기서 퍼왔다.

테이블 A에 있는 ID열의 명시적 값은 열 목록이 상요되고 IDENTITY_INSERT 가 ON일 때만 지정할 수 있습니다.


이 메세지가 나오는 이유는 추측이지만 이런것 같다.

INSERT ... SELECT 사용 시 TABLE 명 뒤에 컬럼 정의를 안하면 발생하는 에러로 보인다.

따라서 INSERT ... SELECT 사용 시에는 반드시 컬럼명을 명시해줘야만 에러가 발생하지 않는다.


그리고 INSERT ... SELECT 하기 전에
SET IDENTITY_INSERT 테이블명 ON 또는 SET IDENTITY_INSERT 테이블명 OFF
적절히 사용해줘야만 문제 없이 입력될 것이다.


SET IDENTITY_INSERT 테이블명 ON 은 인덱스를 수동으로 입력 가능하게 하는 명령이고,

SET IDENTITY_INSERT 테이블명 OFF 은 인덱스를 자동으로 입력 가능하게 하는 명령이다.

'.NET > ADO.NET' 카테고리의 다른 글

내장 프로시저  (0) 2010.08.04
회원탈퇴시 모든정보 날리기  (0) 2010.07.26
다른컴퓨터로 DB 복사  (0) 2010.07.12
내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
Posted by 아몰라
2010. 8. 4. 22:56

 

 

 

1.날짜 및 시간 함수

GETDATE

시스템 날짜 정보를 보여준다.

SELECT GETDATE()

DATEADD

원래 날짜에서 원하는 만큼의 날짜를 더하거나 빼준다.

SELECT GETDATE(), DATEADD(DAY, 3, GETDATE()) AS ‘3일후

DATEDIFF

기준이 되는 시간과의 시간차

SELECT DATEDIFF(DAY, GETDATE(),’2010-06-15’ 00:00:00.000’)

DATENAME

지정한 특정 날짜의 한 부분을 나타내는 문자열을 반환한다.

SELECT DATENAME(DAY, GETDATE()) AS’

DATEPART

날짜의 부분을 구해준다.

SELECT DATEPART(year, getdate())

year,month,day

날짜형 date값에서 각각 해당하는 날짜 값을 선택 출력해준다.

SELECT YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())

GETUTCATE

국제 표준시를 보여준다.

SELECT GETDATE() AS’현재시간’, GETUTCDATE() AS ‘UTC시간

 

2.수치연산 함수

ABS

수의 절대값을 반환해준다.

ABS(-1), ABS(0.1), ABS(4)

CEILING,FLOOR

최소 정수와 최대 정수를 구해준다.

SELECT CEILING($123.45) SELECT FLOOR(123.45)

ROUND

자리수를 반올림할 때 사용한다.

SELECT ROUND(167.77, 1)

SIGN

양수, 0, 음수 부호를 결정할 때 사용된다. 양수=1, 음수=-1, 0=0을 반환

SELECT SIGN(-7), SIGN(7), SIGN(0)

SIN,COS,TAN,COT

삼각함수에서 사용되는 함수.

SELECT SIN(45.00)

RAND

난수를 발생 시키는 함수

SELECT RAND()

SQUARE,SQRT

제곱값 제곱근을 구해주는 함수

SELECT SQUARE(11)    SELECT SQRT(121)

 

 

 

 

 

 

3.집계 함수

SUM

합계를 구해주는 함수

SELECT SUM(sal) FROM employer

AVG

평균을 구해주는 함수

SELECT AVG(sal) FROM employer

MAX, MIN

최대값과 최소값을 구해주는 함수

SELECT MAX(sal) FROM employer

COUNT

그룹의 항목 수를 반환하는 함수

SELECT COUNT(DISTINCT TYPE), COUNT(*) FROM TITLES

GROUPING

해당 인수로 쓰인 값이 ROLLUP이나 CUBE연산사용 유무를 반환하는 함수

SELECT PUB_ID, GROUPING(PUB_ID) FROM TITLES GROUP BY PUBID WITH ROLLUP

STDEV

통계에서 표준편차를 구할 때 사용

SELECT STDEV(SAL) FROM EMPLOYER

 

4.문자열 함수

LEFT, RIGHT,SUBSTRING

왼쪽, 오른쪽, 시작점에서의 길이만큼의 문자를 구해준다.

DECLARE @STR VARCHAR(50)

SET @STR = ‘YOU ARE BITSTU’

SELECT LEFT(@STR,3), RIGHT(@STR,3), SUBSTRING(@STR,3,4)

LOWER, UPPER

대소문자 변경 함수

SELECT LOWER(‘Hello Man’) SELECT UPPER(‘Hello Man’)

ASCII, CHAR

해당 문자의 ASCII숫자값을 보여주고 ASCII 문자 값을 보여준다.

SELECT ASCII(‘A’) SELECT CHAR(65)

CHARINDEX

특정한 문자열이 시작되는 시점의 숫자를 반환해준다.

SELECT CHARINDEX(‘ARE’, ‘YOU ARE BITSTU’)

REPLACE

일정한 문자열 부분을 다른 문자열로 치환

SELECT REPLACE(‘우리는 선문대학생’,’선문대학’,’비트’)

LEN,DATELENGTH

문자열 길이를 반환

SELECT LEN(‘SUNMOON’)   SELECT DATELENGTH(‘SUNMOON’)

REVERSE

문자열을 역순으로 출력

SELECT REVERSE(‘SUNMOON’)

 

 

 

 

 

5.구성함수

@@connections

연결 또는 연결을 시도한 횟수

Select @@connections

@@detefirst

매주 지정된 첫째 날을 나타내는 요일관련 숫자 값

Select @@detefirst

@@language

사용언어

Select @@language

@@max_connections

최대 동시 연결자수

Select @@max_connections

@@textsize

select문이 반환하는 text 데이터의 최대길이를 바이트단위로 지정

Select @@textsize

@@options

SET옵션에 대한 정보들

Select @@options

@@spid

사용자 프로세스의 서버 프로세스 식별자

Select @@spid

 

6.메타 데이터 함수

Col_length

컬럼 길이

Col_name

컬럼 이름

db_id, db_name

DB식별자(ID),  DB이름

file_id, file_name

파일 식별자(ID), 파일 이름

fileproperty

파일 속성 정보

object_id, object_name

DB개체의 식별자(ID), DB개체 이름

@@procid

저장프로시저의 식별자(ID)

 

7.보안 함수

is_member

현재 사용자가 NT그룹이나 SQL서버 사용자인지 확인

suser_id

사용자의 로그인 ID

suser_name

사용자의 로그인 ID이름

suser_sname

사용자의 보안ID에 대한 ID이름

user_id, user_name

DB사용자 ID, 이름

fn_trace_geteventinfo

추적중인 이벤트에 대한 정보

has_dbaccess

사용자가 DB에 접근할 수 있는지 정보

 

8.시스템 함수

app_name

현재 세션의 응용프로그램 이름

case

조건문에서 하나의 경우를 선택적으로 반환

cast, convert

데이터 형식을 명시적으로 변경

cast(int as varchar(5))     convert(varchar(5), int)

current_user

현재 사용자

@@error

에러가 발생했을 때 에러번호를 보여준다.

@@identity

identity열 마지막으로 입력된 데이터의 identity값을

보여준다.

host_id, name

워크스테이션 ID, 이름

ullif

두식이 같으면 NULL반환

Fn_helpcollations

모든 데이터 정렬 목록

 

9.시스템 통계 함수

@@cpu_busy

cpu의 소비시간

@@idle

서버의 유효시간

@@pack_received

서버가 네트워크에서 읽은 입력 패킷 수

@@pack_sent

서버가 네트워크에 기록한 출력 패킷 수

@@timeticks

틱 당 mili-second

@@total_read

디스크 읽기 수

@@total_write

디스크 쓰기 수

 

 

 

 

 

 

 

 

 

 

 

 

 

저장 프로시저

 

저장 프로시저란 pre-compiled procedure, 즉 서버에 미리 컴파일 되어 있는 SQL 코드이다. 서버에 미리 컴파일 되어 있어 실행이 빠른 장점을 가진다.

 

à저장 프로시저는 데이터베이스에 의해 컴파일 된다. 일반 SQL문과는 다르게 저장 프로시저가 만들어질 때 최적화된 실행 계획을 세우고 저장함으로써 다시 실행될 때에는 재사용하게 된다.

 

 à데이터베이스를 안전하게 보호 할 수 있다. 클라이언트로 접근하게 되는 사용자에 대해서는 SQL사용시 저장 프로시저만을 사용하게 함으로써 클라이언트가 직접 데이터를 변경하는 것을 막을 수 있다.

 

 à클라이언트가 서버로 보낼 많은 SQL문을 서버에 저장하고 단순히 저장 프로시저의 이름과 매개변수만 보냄으로써 네트워크에 대한 부담을 줄일 수 있다.

 

 à출력 매개 변수를 사용해서 레코드와 함께 여러 값들을 반환할 수 있다.

 

 

<간단한 저장 프로시저 만들기>

1.

서버 탐색기를 통해서 새 저장 프로시저를 추가해 준다.

2.

저장 프로시저를 작성 후 저장해 준다.

3.

서버탐색기의 저장프로시저에서 작성한 프로시저를 실행한다.

4.

다음과 같이 저장프로시저를 사용하여 출력내용을 볼 수 있다

 


'.NET > ADO.NET' 카테고리의 다른 글

특정 행 복사하기  (0) 2010.08.06
회원탈퇴시 모든정보 날리기  (0) 2010.07.26
다른컴퓨터로 DB 복사  (0) 2010.07.12
내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
Posted by 아몰라





회원테이블(회원번호) - 작물테이블, 다이어리테이블, 농사용어테이블

이렇게 크게 3개의 큰 테이블이 회원번호를 외래키로 사용하고있고

이 3개의 테이블은 외래키로 사용하는 회원번호와 다른 정보들을 합쳐서 기본키를  많은  다른 하위 테이블로 뿌려지고 있다.

그래서 회원탈퇴를 할 경우 관계를 생각해서 삭제해야되는데(관계를 맺었을 경우)

 만약 키를 가져다 쓰고있는 테이블보다 먼저 상위에 있는

테이블에서 삭제를 할 경우 관계로 인한 오류가난다.

그래서 하위테이블부터 삭제해 나가면서 상위까지 올라가야 한다.

프로시저 쿼리에는 회원번호 한개만 받았으므로 받은 회원번호 하나가지고 그와 연관된 모든 것들을 삭제하면된다.

예를 들어
delete DIARY_GROWING from DIARY where @MEM_NUM = DIARY.Mem_Num and DIARY_GROWING.D_Number(다이어리에 기본키를 가져다쓰는 외래키) = DIARY.Number(기본키)

위와 같이 하면 DIARY_GROWING 테이블에서 DIARY에 몇번 회원정보들이 다 날라 갈것이다. 이렇게

JOIN 연산을 통하여 하나하나 삭제하면된다.

당연히 위에처럼 하위테이블블 데이터들을 날렸으면 상위인 DIARY테이블에 회원정보도 날려주면 된다.

처음에 delete CROPS from CROP_ACCOUNT, aaa, bbb, ccc, ddd, eee where @MEM_NUM = CROPS.Mem_Num and ..........이런식으로 하여서 한번에 CROPS에 관련된 테이블을 날릴수 없나해서 시도해보았지만 안되어서

할수없이 테이블 하나당 한줄씩 추가해서 날려주었다.


'.NET > ADO.NET' 카테고리의 다른 글

특정 행 복사하기  (0) 2010.08.06
내장 프로시저  (0) 2010.08.04
다른컴퓨터로 DB 복사  (0) 2010.07.12
내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
Posted by 아몰라
원래는 해당 데이터베이스를 마우스로 우클릭하면 데이터베이스 복사 항목이 있는데

잘되지않아서 꼼수로 해보았다~~프로그램은 sql server 2005를 사용하였다.

1. 먼저 원본컴퓨터에서 Sql 2005를 키고 접속하여 백업시킬 데이터베이스를 마우스로 선택하여 우클릭하면 복원이라는
  항목이 있다. 클릭한다.



2.백업할 위치를 선택하고 확인을 눌른다. 그러면 백업이 된다.


3.방금 백업한 위치에 .bak 파일을 복사하여 복사할 다른 컴퓨터로 옮긴다.
  그리고 해당 컴퓨터에서 sql 2005에 접속하여 데이터베이스를 마우스로 우클릭 한 다음 데이터베이스 복원을 눌른다.


4.장치를 선택하고 백업할 파일을 찾는다.






5. 백업할 셋을 선택하고 확인버튼을 누른다.
 


6. 접속해보면 DB가 생긴걸 볼 수 있다.

'.NET > ADO.NET' 카테고리의 다른 글

내장 프로시저  (0) 2010.08.04
회원탈퇴시 모든정보 날리기  (0) 2010.07.26
내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
Posted by 아몰라



1. 내부 스칼라변수 선언

ALTER PROCEDURE INSERT_CROP_BIONAME 
 (
 @CROP_NAME varchar(250), 
 @MEM_NUM int,
 @BIO_NAME varchar(250) 
 )
 
AS

declare @CROP_NUM int   - 이렇게 선언한다. 외부와 직접적인 상관없이 프로시저 내부에서 어떠한
declare @RESULT int          연산이나 처리를 해서 외부에 값을 줄 때 유용하게 사용 할 수 있다.

 select @CROP_NUM = Number from CROPS where  @CROP_NAME = Crop_Name and @MEM_NUM = Mem_Num
 
 select @RESULT = count(*) from CROP_ACCOUNT where @CROP_NUM = Crop_Number
 
 if(@RESULT = 0)
 begin
  insert into CROP_ACCOUNT values(@CROP_NUM ,@BIO_NAME, NULL , NULL)
 end
 else
 begin
  update CROP_ACCOUNT set Crop_Biomial_Name = @BIO_NAME where @CROP_NUM = Crop_Number
 end
  
  
 RETURN




2. 스칼라 변수 초기화

declare @TEST int

SET @TEST  =  0     - 위와 같이 어떠한 변수가 생기면 어떠한 값을 초기화 시키고싶을때 이렇게 한다.d


3. 반복문 사용법

ALTER PROCEDURE WEATHER_SAVE 
 (
 @City varchar(250) 
 )
 
AS

declare @i int
declare @j int


set @i = 2007
set @j = 1

while (@i <= 2009)
begin
 while(@j <=12)
  begin
   insert into WEATHER_INFO values(@City, @i, @j , NULL, NULL, NULL, NULL, NULL)
   set @j = @j + 1    - 보는 바와 같이 이렇게 SET은 초기화뿐만 아니라 이러한 연산을 할 때도 사용된다.
  end
set @j = 1
set @i = @i + 1
end


 RETURN









 

'.NET > ADO.NET' 카테고리의 다른 글

회원탈퇴시 모든정보 날리기  (0) 2010.07.26
다른컴퓨터로 DB 복사  (0) 2010.07.12
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
Posted by 아몰라

저장하기


1. 파일주소 가져오기

            OpenFileDialog openFileDialo1 = new OpenFileDialog();
            openFileDialo1.Filter = "이미지 files(*.bmp)|*.bmp";
            if (openFileDialo1.ShowDialog() == DialogResult.OK)
            {
                ImageSave(openFileDialo1.FileName);  //파일주소를 넘겨줬다
            }


2. 바이트배열에 저장하기

FileStream stream = new FileStream(파일주소, FileMode.Open, FileAccess.Read); //파일입출력을 할 수 있게한다.
BinaryReader reader = new BinaryReader(stream);    //이진값으로 읽는다.                                      

byte[] photo = reader.ReadBytes((int)stream.Length); //이진화시킨값을  바이트배열에 넣는다.


3.DB에 바이트배열을 넣는다.

SqlParameter sparam2 = new SqlParameter("@TEST_IMAGE", SqlDbType.Image, photo.Length);            sparam2.Value = photo;


로드하기


SqlDataReader dr = scom.ExecuteReader(); 
//ExecuteReader()를 날려서 CommandText을 Connection에 날려주고 SqlDataReader를 반환해준다.
//select Crop_Image from Image_Table where @CROP_NAME = Crop  쿼리는 이렇다.

while (dr.Read())
{
       MyData = (byte[])dr.GetValue(0);
       ArraySize = MyData.GetUpperBound(0); //배열크기의 상한값을 넣어준다.
}

MemoryStream ms = new MemoryStream(MyData, 0, ArraySize+1);
//파일을 읽을수 있게 스트림형식으로 바꿔준다.

pictureBox1.Image = Image.FromStream(ms);
//사진을 보여준다.





'.NET > ADO.NET' 카테고리의 다른 글

다른컴퓨터로 DB 복사  (0) 2010.07.12
내장 프로시저(사용법)  (0) 2010.07.10
DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
Posted by 아몰라
2010. 5. 28. 11:52

모델러의 창의성은 반드시 논리적인 근거에 의해서 표현되어야만 한다.

'.NET > ADO.NET' 카테고리의 다른 글

내장 프로시저(사용법)  (0) 2010.07.10
DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
Posted by 아몰라
2010. 4. 2. 23:42

                                                                                  

 

DataAdapter의 기능

-     데이터베이스의 Connection으로부터 DataSet을 생성하는 중간 역할 담당

-        DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 SQL 명령 집합 및 데이터베이스 연결을 지원하는 클래스

-        DataTable와 같은 비연결 지향적 클래스들이 데이터베이스와 연결

 

-      Command로 작업할 때에는 데이터베이스와 연결된 상태에서 작업

-       DataAdapter로 작업을 할 경우에는 DataSet이라는 결과를 얻은 후에 데이터베이스와의 연결을 끊고, DataSet 자체만으로도 작업을 수행한다.

-       작업이 끝난 후에는 DatatAdapter를 통해 DataSet의 변경된 부분이 실제 데이터베이스에 반영 가능

 


 

 SelectCommand 속성

 

SelectCommand 속성을 이용하여 원본 DB의 데이터 소스에서 레코드를 검색하는데 사용하는 SQL문이나 Proc를 설정할 수 있다.

- SelectCommand 에 설정된 SQL문을 실행했을때 검색결과가 없어서 SelectCommamd가 행을 반환하지 않으면 데이터 셋에 테이블이 추가되지 않는다.

-    SelectCommand 문을 실행해서 나온 결과에 대해서 SqlDataAdapter클래스의 Fill메소드가 데이터 셋에 테이블을 추가하게 된다.

SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand();

adapter.SelectCommand.Connection = sConnection;

adapter.SelectCommand.CommandText = Query;




 
InsertCommand 속성

 

-    InsertCommand 속성을 이용하면 새로운 레코드를 데이터 소스에 삽입할 SQL 문이나 Proc를 설정할 수 있다.

-    InsertCommand를 이용해서 데이터 셋에 자료를 추가하는 등의 처리를 할 수 있다


adapter.InsertCommand = new SqlCommand();         

 adapter.InsertCommand.Connection = sConnection;

 adapter.InsertCommand.CommandText = Query;

adapter.InsertCommand.Parameters.Add("@name",SqlDbType.VarChar,10,"name");

adapter.Update(ds, "tb_insert");

 

DeleteCommad 속성

 

-   DeleteCommand는 행을 삭제할때 사용되는 속성이다.

-    DeleteCommand 속성을 이용해서 행(레코드)를 데이터 집합으로부터 삭제할 SQL 문이나 Proc를 가져오거나 설정할 수 있다.

adapter.DeleteCommand = new SqlCommand();

adapter.DeleteCommand.Connection=(SqlConnection)adapter.SelectCommand.Connection;

adapter.DeleteCommand = new SqlCommand();

adapter.DeleteCommand.CommandText = strUpdateQurey;

adapter.DeleteCommand.CommandType = CommandType.Text;

 

 UpdateCommand 속성

 

-    작업을 하다보면 여러가지 이유로 입력된 데이터를 수정해야 할 때가 있다.

-    UpdateCommand 속성을 이용하면 데이터 소스에서 레코드를 업데이트 하는데 사용하는 SQL 문이나 Proc를 가져오거나 설정할 수 있다

 

adapter.UpdateCommand = new SqlCommand();

adapter.UpdateCommand.Connection=(SqlConnection)adapter.SelectCommand.Connection;

adapter.UpdateCommand.CommandText = strUpdateQuery;

adapter.UpdateCommand.CommandType = CommandType.Text;

adapter.UpdateCommand.Parameters.Add(myParam);

 

메소드

설명

Fill

데이터 셋의 행을 데이터 소스와 일치하도록 한다.

FillSchema

데이터 셋에 DataTable을 추가하고 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

Update

데이터 셋과 동일하게 데이터 소스를 업데이트한다.

 

 예제코드

 

string connString = "server = 504-24\\SQL2005;database=tempdb;";

 connString = connString + "uid=Hello;password=dhtlak;";

 SqlConnection sConnection = new SqlConnection(connString);

  SqlDataAdapter adapter = new SqlDataAdapter();

  adapter.SelectCommand = new SqlCommand();

  adapter.SelectCommand.Connection = sConnection;

   String Query = "select * from titile";

   adapter.SelectCommand.CommandText = Query;

   DataSet ds = new DataSet("Mytable");

    adapter.FillSchema(ds, SchemaType.Source, "titile");

    adapter.Fill(ds, "titile");

  DataRow[] r3 = ds.Tables["titile"].Select();

  foreach (DataRow ro in r3)

   {

          Console.WriteLine(ro["titile_id"].ToString() + ro["type"].ToString());

   }

 

 

'.NET > ADO.NET' 카테고리의 다른 글

DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
Posted by 아몰라
2010. 4. 2. 20:44


DataSet -  여러개의 테이블로 구성되있다.



DataTable의 구성요소

DataRow(행에 대한 정보)
DataColumn(열에 대한 정보)
Constraint(값을 제어하는 규약)
DataRelation(두 테이블 간의 관계)



DataRelation(관계)

- DataColumn 개체를 통해 두 개의 DataTable 개체를 서로 연결하는데 사용

- 부모 및 자식 테이블의 일치하는 열 간에 관계가 만들어짐

- DataSet 내의 한 DataTable에서 다른 DataTable로 이동을 허용





또 다른 예제

static void Main(string[] args)
{
DataSet dataSet = new DataSet("MyData");
DataTable table = new DataTable("MyTable");
DataRow row;

table.Columns.Add("이름", typeof(string));       //컬럼 추가
table.Columns.Add("나이", typeof(int));
table.Columns.Add("학번", typeof(string));

 

//레코드 추가
row = table.NewRow();
row["이름"] = "천정민";
row["나이"] = 26;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "조아라";
row["나이"] = 23;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "안용준";
row["나이"] = 26;
row["학번"] = "987654321";
table.Rows.Add(row);

dataSet.Tables.Add(table);     //DataSet에 테이블 추가

 

//table 테이블 레코드 변경전

Console.WriteLine("table 테이블 레코드 변경전");
DataRow[] r = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " + ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//table 테이블 레코드변경
dataSet.Tables["MyTable"].Rows[0].Delete();           //테이블 삭제
dataSet.Tables["MyTable"].Rows[0].BeginEdit();        //수정시작
dataSet.Tables["MyTable"].Rows[0]["이름"] = "송창은";   //레코드 값 변경
dataSet.Tables["MyTable"].Rows[0].EndEdit();          //수정끝
dataSet.Tables["MyTable"].Rows[0].AcceptChanges();    //변경된 내용 실행

 

//table 레코드 값 얻어오기
Console.WriteLine("table 레코드 값 변경 후");
DataRow[] r2 = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r2)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " +
ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//다른 테이블 생성 및 레코드 생성
DataTable OtherTable = new DataTable("OtherTable");
OtherTable.Columns.Add("학번", typeof(string));
OtherTable.Columns.Add("학년", typeof(int));

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 4;
OtherTable.Rows.Add(row);

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 3;
OtherTable.Rows.Add(row);

dataSet.Tables.Add(OtherTable);     //DataSet 추가

 

//OtherTable 레코드 값 얻어오기
Console.WriteLine("OtherTable 레코드 값 출력");
DataRow[] or = dataSet.Tables["OtherTable"].Select();
foreach (DataRow dr in or)
{
    Console.WriteLine("학번 : " + dr[0].ToString() + " 학년 : " + dr[1].ToString());
}

Console.WriteLine();


//pk설정
dataSet.Tables["Mytable"].PrimaryKey = new DataColumn[] { dataSet.Tables["Mytable"].Columns["학번"] };

 

//Relation 설정
DataRelation rel = new DataRelation("Stu", dataSet.Tables["Mytable"].Columns["학번"], dataSet.Tables["OtherTable"].Columns["학번"]);
dataSet.Relations.Add(rel);

 

//Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 출력
Console.WriteLine("Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 검색");
DataRow[] childrow = dataSet.Tables["MyTable"].Rows[0].GetChildRows("Stu");
//부모테이블의 0번째 row를 관계맺은 컬럼을 자식테이블에서 찾아라
foreach (DataRow cr in childrow) //childrow에 있는 값을 DataRow형식으로 가지고 오겠다
{
    Console.WriteLine("학번 : " + cr[0].ToString() + " 학년 : " + cr[1].ToString());
}
Console.WriteLine();

 

//테이블 갯수 출력
Console.WriteLine("테이블 수 : " + dataSet.Tables.Count);

//테이블 명 출력
foreach (DataTable t in dataSet.Tables)
{
    Console.WriteLine("테이블 명 : " + t.ToString());
}
//Console.WriteLine("테이블 명 : " + dataSet.Tables[0]);
//Console.WriteLine("테이블 명 : " + dataSet.Tables[1]);

//컬럼 명 출력
Console.WriteLine("컬럼 명");
foreach (DataColumn dc in dataSet.Tables[0].Columns)
{
    Console.Write(dc.ColumnName + " ");
}
Console.WriteLine();
}

'.NET > ADO.NET' 카테고리의 다른 글

DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
Posted by 아몰라
2010. 4. 2. 20:21

DataView는 데이터 바인딩 응용 프로그램에서 자주 사용되는 기능으로, 이 기능을 사용하면 DataTable에 저장되어 있는 데이터에 대해 서로 다른 뷰를 만들 수 있습니다. DataView를 사용하여 테이블의 데이터를 다른 정렬 순서로 노출시킬 수 있으며, 행 상태에 따라 또는 필터 식을 기준으로 데이터를 필터링할 수 있습니다.

DataView에서는 원본 DataTable의 데이터에 대한 동적 뷰를 제공합니다. 따라서 변경이 발생할 경우 DataTable의 내용, 순서 및 멤버에 해당 변경 사항이 적용됩니다. 이 동작은 특정 필터 및/또는 정렬 순서에 따라 테이블에서 DataRow 배열을 반환하는 DataTableSelect 메서드와는 다릅니다. 이내용은 원본으로 사용하는 테이블의 변경 사항을 적용하기는 하지만 해당 멤버 및 순서는 정적으로 유지됩니다. DataView의 동적 기능은 데이터 바인딩 응용 프로그램에 사용하기에 아주 적합합니다.

DataView에서는 단일 데이터 집합에 대한 동적 뷰를 제공하는데 이 동적 뷰에는 데이터베이스 뷰와 매우 유사하게 여러 가지 정렬 및 필터링 기준을 적용할 수 있습니다. 그러나 데이터베이스 뷰와 달리 DataView는 테이블로 취급될 수 없고 조인된 테이블의 뷰도 제공할 수 없습니다. 또한 소스 테이블에 있는 열을 제외하거나 계산을 통해 만들어지는 열과 같이 소스 테이블에 없는 열을 추가할 수 없습니다.

DataViewManager를 사용하여 DataSet의 모든 테이블에 대한 뷰 설정을 관리할 수 있습니다.DataViewManager에서는 각 테이블에 대한 기본 뷰 설정을 관리할 수 있는 편리한 방법을 제공합니다. 컨트롤을 둘 이상의 DataSet 테이블에 바인딩할 때는 DataViewManager에 바인딩하는 것이 좋습니다.


예제 - msdn 참고

출처 :  ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ko/wd_adonet/html/0fe5dfa2-c1cd-435f-90b6-b4dd2e3ef34b.htm

'.NET > ADO.NET' 카테고리의 다른 글

SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
SqlCommand 클래스  (0) 2010.03.31
Posted by 아몰라
이전버튼 1 2 이전버튼