- DataSet 다루기
DataSet은 ADO.NET의 구조 중 중요한 부분으로 데이터베이스로부터 가져온 데이터를 캐쉬 메모리에 저장하여 사용한다. 즉, 메모리에 있는 데이터베이스라고 할 수 있겠다.
DataSet은 데이터베이스에 있는 내용 및 구조를 그대로 옮겨오는 것이기 때문에 데이터베이스에 대한 연결은 일반 연결과정과 같다. 이 연결을 통해서 데이터베이스의 내용을 가상 데이터베이스인 DataSet에 넣는다.
데이터베이스와 DataSet의 상호작용은 SqlDataAdapter나 OleDbDataAdapter 등을 통해 제어된다.
DataSet의 속성
속 성 |
설 명 |
CaseSensitive |
대소문자를 구분할 것인지 아닌지를 지정, true이면 대소문자를 구분한다. |
DataSetName |
이 데이터셋의 이름을 얻거나 지정할 수 있다. |
Relations |
부모 테이블에서 자식 테이블로의 탐색을 허가하고 테이블 연결의 관계에 대한 커넥션을 얻는다. |
Tables |
데이터셋에 포함된 테이블의 컬렉션을 얻는다. |
데이터셋의 메소드
메소드 |
설 명 |
AcceptChanges |
데이터셋이 로드되거나 가장 마지막의 AcceptChanges가 요청된 이후 데이터셋의 모든 변경 사항을 적용한다. |
Clear |
모든 테이블에 있는 행을 지운다. 다시 말하면, 데이터셋의 데이터를 모두 없앤다. |
Clone |
모든 테이블 구조와 관계 제약 등을 포함한 데이터셋의 구조만을 복사한다. 복사한 데이터셋이 리턴된다. |
Copy |
데이터셋에 대한 구조와 데이터를 복사한다. 복사한 데이터셋이 리턴된다. |
GetChanges |
AcceptChanges가 마지막으로 호출되거나 DataSet이 로드된 이래 만들어진 모든 변경을 포함한 데이터셋의 복사를 리턴한다. |
GetXml |
데이터셋에 포함된 데이터의 XML 표현을 문자열로 반환한다. |
GetXmlSchema |
데이터셋에 저장된 데이터의 XML 표현에 대한 XSD 스키마를 문자열로 반환한다. |
HasChanges |
데이터셋의 변경 즉, 새로운 행의 추가, 삭제, 수정에 대한 것들이 있는지 없는지의 여부를 나타내는 값을 가져온다. |
ReadXml |
데이터셋으로 XML 데이터의 구조를 읽는다. 실제 읽어 들인 데이터는 데이터셋에 저장되어진다. |
ReadXmlSchema |
데이터셋으로 XML 구조(Schema)를 읽어 들인다. |
RejectChanges |
최종적으로 DasaSet.AcceptChanges가 호출되거나 만들어진 이후의 데이터셋으로부터 만들어진 모든 변경을 RollBack한다. |
WriteXml |
데이터셋이 포함하고 있는 데이터나 스키마 등을 쓴다. |
WriteXmlSchema |
데이터셋의 스키마를 쓴다. |
<?xml:namespace prefix = o />
- DataSet 만들기
DataSet을 만드는 방법은 생성자를 호출하여 만들거나 기존 DataSet을 기반으로 하여 일부 스키마를 복사하여 만들 수 있다. DataSet을 만들 때 DataSet의 이름을 지정하지 않을 경우 자동으로 “NewDataSet”이라는 이름으로 지정된다.
다음은 DataSet을 만드는 예이다.
DataSet ds = new DataSet(“데이터셋이름”);
- DataSet의 DataTable
DataSet은 테이블의 집합이라고 할 수 있다. 테이블 간의 관계 등 다른 정보들도 물론 포함되어 있지만 가장 근본이 되는 것은 그 속에 포함되어 있는 테이블들이라고 말할 수 있다.
DataSet에 포함되어 있는 테이블들은 DataSet의 속성인 Tables를 통해 얻을 수 있는데 Tables 속성은 DataTable 개체의 집합인 DataTableCollection으로 이루어져 있다.
DataSet에 DataTable을 추가하기 위해서는 DataTableCollection의 Add 메소드를 이용하여 작업할 수 있다. 또한 DataSet에서 DataTable를 삭제하고자 한다면, Remove 메소드를 이용하면 된다.
DataSet에 테이블 추가
DataSet.Tables.Add(DataTable);
DataSet에서 테이블 삭제
DataSet.Tables.Remove(DataTable);
DataTable의 속성
속성 |
설 명 |
CaseSensitive |
테이블 내에 있는 데이터들의 문자열 비교시 대소문자를 구분할지의 여부를 지정한다. |
ChildRelations |
테이블과 자식 관계에 있는 DataRelation에 대한 컬렉션을 가져온다. |
Columns |
테이블에 속한 DataColumn들에 대한 컬렉션을 가져온다. |
Constraints |
테이블에 대한 Constraint들에 대한 컬렉션을 가져온다. Constraint는 테이블에 대한 제약 조건이다. |
DataSet |
테이블이 속해 있는 DataSet을 리턴한다. |
DefaultView |
테이블을 정렬하거나 필터링 할 수 있는 DataView를 리턴한다. |
HasErrors |
테이블이 속하는 DataSet의 테이블에 오류가 있는지의 여부를 나타낸다. |
ParentRelations |
테이블과 부모관계에 있는 DataRelation에 대한 컬렉션을 가져온다. |
PrimaryKey |
데이터 테이블에 대한 기본 키로 사용되는 열의 배열을 가져오거나 설정한다. 이때 리턴되는 값은 DataColumn 개체의 배열로 이루어진다. |
Rows |
테이블에 속한 DataRow들에 대한 컬렉션을 가져온다. |
TableName |
DataTable의 이름을 가져오거나 설정한다. |
DataTable의 메소드
메소드 |
설 명 |
AcceptChanges |
AcceptChanges가 마지막으로 호출된 이후 테이블에서 변경된 내용을 모두 적용한다. |
Clear |
테이블에 들어 있는 모든 데이터를 지운다. |
Clone |
테이블의 구조를 복사하여 지운다. |
Compute |
인자로 사용된 필터와 계산식을 통해 제한된 행에 대한 계산식을 수행한다. |
Copy |
테이블의 구조와 데이터를 복사하여 리턴한다. |
GetChanges |
테이블이 로드되거나 마지막으로 사용된 AcceptChanges 후에 변경된 DataTable의 복사본을 리턴한다. |
GetErrors |
테이블에 오류가 있을 경우 오류를 가지고 있는 열들을 DataRow의 배열로 리턴한다. |
ImportRow |
모든 값 및 속성을 유지한 채 DataRow을 DataTable에 복사한다. |
NewRow |
테이블과 같은 스키마를 갖는 DataRow를 만든다. |
RejectChanges |
테이블이 로드되거나 마지막으로 사용된 AcceptChanges 후에 변경된 내용을 모두 RollBack하여 원상태로 돌린다. |
Reset |
테이블을 원래 상태로 다시 설정한다. |
Select |
필터링 조건이나 열 상태 등과 일치하는 모든 열을 DataRow의 배열로 리턴한다. |
- DataTable에 열 추가하기
DataTable을 처음 만들 때에는 스키마가 존재하지 않는다. DataTable에 대한 스키마는 DataColumn을 먼저 생성한 후 DataTable의 Columns 속성의 Add 메소드를? 이용하여 DataColumn을 추가한다.
DataColumn의 속성
속성 |
설 명 |
AllowDBNull |
null 값의 허용 여부를 가져오거나 설정한다. |
AutoIncrement |
테이블에 더해지는 새로운 열의 칼럼을 자동으로 오름차순으로 정렬할 것인가를 가져오거나 지정한다. |
AutoIncrementSeed |
AutoIncrement 속성이 true로 설정된 열의 시작 값을 가져오거나 설정한다. |
AutoIncrementStep |
AutoIncrement 속성이 true로 설정된 열에 사용되는 증분을 가져오거나 설정한다. |
Caption |
Caption 값을 표시할 수 있는 컨트롤에 표시할 내용을 설정하는 것으로 DataColumn에서 설정하지 않을 경우 칼럼 이름이 사용된다. |
ColumnName |
컬럼 이름을 가져오거나 지정한다. |
DataType |
열에 지정된 데이터의 형식을 가져오거나 지정한다. |
DefaultValue |
새로운 열을 생성했을 때 칼럼의 Default 값을 가져오거나 지정한다. |
Expression |
칼럼의 필터나 값을 계산하거나 칼럼의 집합을 만드는 표현을 가져오거나 지정한다. |
MaxLength |
텍스트 열의 최대 길이를 가져오거나 지정한다. 최대 길이가 없을 경우 -1이 사용되며, 텍스트 속성이 아닌 열에서는 무시된다. |
Ordinal |
ColumnCollection 컬렉션에서 컬럼의 위치를 가져온다. 만약 컬렉션의 멤버가 아니면 -1이 리턴된다. |
ReadOnly |
열을 변경할 수 있는지의 여부를 나타내는 값을 가져오거나 설정한다. |
Table |
칼럼이 포함된 데이터 테이블을 가져온다. |
Unique |
열의 각 행에 있는 값이 고유값이어야 하는 지의 여부를 가져오거나 지정한다. |
DataTable dt = new DataTable(“TestTable”);
DataColumn dc1 = new DataColumn(“field1”, typeof(int));
DataColumn dc2 = new DataColumn(“field2”, typeof(string));
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
- DataTable에 행 추가하기
DataTable에 데이터를 넣기 위해 사용되는 것이 DataRow이다. DataRow는 DataTable의 Rows 속성으로 얻을 수 있는 DataRowCollection에 추가함으로써 테이블에 추가할 수 있다.
DataRow의 속성
속성 |
설 명 |
HasErrors |
행에 오류가 있는지의 여부를 나타낸다. |
Item |
인덱스나 데이터 칼럼, 칼럼 이름 등을 사용하여 해당 필드의 값을 가져오거나 설정한다. |
ItemArray |
행에 포함되어 있는 모든 필드의 값을 object[] 형태로 가져온다. |
Table |
행이 포함되어 있는 DataTable을 가져온다. |
DataRow의 메소드
메소드 |
설 명 |
AcceptChanges |
AcceptChanges가 마지막으로 호출된 이후 이 행에서 변경된 내용 모두를 적용시킨다. |
Delete |
DataRow를 삭제한다. |
IsNull |
인덱스나 데이터 칼럼, 혹은 칼럼 이름을 사용하여 DataRow의 해당 필드에 널 값이 존재하는지의 여부를 나타낸다. |
RejectChanges |
AcceptChanges를 마지막으로 호출한 이후 변경된 내용을 모두 최소한다. |
SetNull |
지정된 DataColumn의 값을 null로 설정한다. |
DataRow dr = dt.NewRow();
dr[“field”] = 1;
dr[“field”] = “홍길동”
dt.Rows.Add(dr);
- DataTable의 행과 열 출력
DataTable에 포함되어 있는 행(DataColumn)에 대한 정보를 알기 위해서 우선 DataTable의 DataColumns 속성을 이용하여 모든 행들을 가져온다. DataTable에 DataColumn들은 DataColumnCollection 형태로 포함되어 있기 때문에 각각의 DataColumn 값을 인덱스를 이용하여 정보를 가져올 수 있다.
DataTable dt;
foreach(DataColumn dc in dt.Columns)
{
Response.Write(dc.ColumnName + “:” + dc.DataType.ToString());
}
foreach를 이용하지 않고 for 구문을 이용해서 출력을 할 경우에는 DataColumnCollection의 Count를 이용하여 총 개수를 구한 다음 루프 안의 인덱스를 통해 각각의 DataColumn에 엑세스할 수 있다.
다음은 for 구문을 이용한 DataRow들을 출력하는 예이다.
for(int i=0;i<dt.Rows.Count;i++)
{
Response.Write(dt.Rows[i][“field”].ToString() + “:” + dt.Rows[i][“field2”].ToString());
}
}
- 데이터베이스와 DataSet
DataSet은 데이터베이스에 있는 내용 및 구조를 그대로 옮겨오는 것이기 때문에 데이터베이스에 대한 연결은 일반 연결 과정과 같다. 이 연결을 통해서 데이터베이스의 내용을 가상 데이터베이스인 DataSet에 넣게 된다.
데이터베이스와 DataSet의 상호 작용은 SqlDataAdapter나 OleDbDataAdapter 등을 통해 제어되는데, 먼저 SqlDataAdapter에 대한 속성과 메소드이다.
SqlDataAdapter의 속성
속성 |
설 명 |
DeleteCommand |
데이터셋의 삭제된 행과 일치하는 데이터베이스의 행을 삭제할 SqlCommand로, Update가 호출되면 실행된다. |
InsertCommand |
데이터셋에 새로운 행이 추가되었을 때 데이터베이스에 새로운 행을 추가하기 위한 SqlCommand로 Update가 호출되면 실행된다. |
SelectCommand |
데이터베이스의 내용을 DataSet에 채우기 위한 SqlCommand로 Fill메소드가 호출되면 실행된다. |
UpdateCommand |
데이터셋에 수정된 행이 있을 때 데이터베이스의 행을 수정하기 위한 SqlCommand로 Update가 호출되면 실행된다. |
SqlDataAdapter의 메소드
메소드 |
설 명 |
Fill |
데이터 소스의 행과 일치하도록 데이터셋을 채우거나 수정한다. 데이터와 스키마 모두 적용된다. |
FillSchema |
데이터 소스의 스키마와 일치하도록 데이터셋을 채운다. |
Update |
데이터셋의 삽입, 수정, 삭제 등과 같은 내용이 발생한 행마다 각각의 INSERT, UPDATE, DELETE 구문을 호출하여 데이터베이스에 적용시킨다. |
- DataSet 채우기
DataSet에 데이터베이스의 내용을 채우기 위해서는 가장 쉬운 방법은 SqlDataAdapter를 이용하는 것인데, SqlDataAdapter를 이용해 채우기 위해서는 채우려고 하는 Select 쿼리문과 연결하기 위한 SqlConnection이 필요하다.
SqlConnection을 통해 연결한 후 Fill 메소드를 호출함으로써 DataSet에 데이터베이스의 내용을 채울 수 있다.
public DataSet FillDataSet()
{
string sql = “select * from 테이블이름”;
SqlDataAdapter adapter = new SqlDataAdapter(sql, CreateConnection());
DataSet ds = new DataSet();
adapter.Fill(ds, “테이블이름”);
return ds
}
- DataSet의 데이터 엑세스하기
데이터셋에 있는 가상 테이블을 액세스하는 방법은 다음과 같다.
DataSet.Tables[index]
또는
DataSet.Tables[tablename]
데이터셋 클래스에는 Tables라는 속성이 있는데 이것은 데이터셋에 있는 테이블들의 컬렉션을 리턴해 준다. 이러한 테이블의 속성을 이용하여 접근하고자 하는 테이블에 액세스할 수 있다.
테이블에 대한 접근이 이루어졌으니 테이블 속에 들어 있는 열과 행들에 대한 엑세스는 단일 테이블에 엑세스하는 방법과 같다.
foreach(DataRow dRow in ds.Tables[“데이터셋의 테이블이름”].Rows)
{
Response.Write(dRow[“필드이름”].ToString());
}
|