GSI

이것을 보면서 조금더 공부해도 좋을듯 하다.
.net framework의 내용중에서 ado.net 에 관련된 내용이다.
한글로되어 있기 때문에 더 추천 !!

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconaccessingdatawithadonet.asp
Posted by gsi
:

DataSet 객체 만들기

DB&XML 2007. 9. 17. 00:44 |

대부분의 책을 보면 DataSet 등과 같은 DB를 연결하기 위한 부분들이 코드로 직접 작성하는 부분이 많았던거 같다. 내가 지금 하고 있는 VS 2008 Beta 2 에서는 대부분 많은 부분 자동화가 되어 있는듯 하다. 아무래도 2005 이상 부터는 그런거 같은데..
간단하게 DB를 가져와서 Window Form에 연결하는 과정에 대해서 적어 보도록 한다.

기본적으로 SQL이 설치 되어 있고, Northwind DB가 있다고 가정하겠습니다.


Data Sources 창에서 추가하고 시작할때.


사용자 삽입 이미지

메뉴에서 Data를 선택하고 Show Data Sources 를 선택합니다.
선택하면 Data Sources 라는 창이 하나 보이게 됩니다.

사용자 삽입 이미지
Add New Data Source...   를 누르면 창이 하나 보이게 됩니다. 여기서 Database를 선택합니다.
사용자 삽입 이미지
New Connection... 을 누르면 창이 하나 뜨게 됩니다. 여기서 우리가 SQL DB를 사용하기 때문에 Change 를 누르고 Microsoft SQL Server (SqlClient) 를 선택하게 됩니다.
이렇게 하면 Server name가 나오게 됩니다. (단, 로컬에서 사용할때라면 컴퓨터 이름이 나오게 됩니다.)

Server name를 선택하고 Log on to the server 항목에서 Use SQL Server Authentication을 체크 하고 User name와 Password를 입력합니다.

Connect to a database 에서 Select or enter a database name를 Northwind로 선택하게 됩니다.
모두 성공적으로 처리가 되었는지를 알아 보기 위해서 Test Connection을 선택하면 메시지 박스가 뜨게 됩니다.

제대로 되었다면 아래와 같은 내용을 보실수 있을겁니다.
사용자 삽입 이미지

next를 눌러서 다음 화면으로 넘어 갑니다.
기본 이름을 사용하시거나 다른 이름을 지정하고 next를 다시 누릅니다.
해당 테이블을 선택할 수 있는 화면이 나오는데요.
여기서 해당 테이블을 선택하고 사용할 컬럼을 따로 선택할 수도 있습니다.
(여기까지는 별도 이미지 없음 ^^)

여기까지 되었다면. Data Srouces 라는 창에 NorthWindDataSet 라는 부분이 보이게 되며
Solution Explorer 의 화면에 NorthwindDataSet.xsd와 몇개의 파일이 하위 트리로 생성되게 됩니다.
사용자 삽입 이미지
위의 화면에서 NorthwindDataSet.xsd 를 클릭 하게 되면 중앙의 화면과 같이 나오게 됩니다.

중앙 화면의 Server Explorer 라는 부분을 클릭 하게 되면 Server Explorer이라는 창이 하나 보이게 되는데요 이전에 추가 했던 ***.Northwind.dbo 라는 부분이 보이게 됩니다.
여기서 해당 테이블을 중앙 화면으로 드래그 해서 추가해 주시면 됩니다.

사실 여기서 많은 방법이 있지만..
테이블을 추가 하고 나면 그 해당 테이블의 모든 정보가 화면에 드래그 되서 다 들어가게 됩니다. 이 부분에 대해서 부분적인 컬럼정보만 필요하다면 Data Sources 창에서 편집이 가능하며 다른 테이블을 가져와서 세부 연결해주는 것도 가능하게 됩니다.
(아.. 많은 부분 이미지 처리를 못하는게 좀 아쉽습니다. 용량 문제로 인해서.. -.-)

아래 화면은 필요한 부분만 편집해서 나온 최종 모습입니다.
사용자 삽입 이미지

이제 윈도우 폼을 배치 하고 해당 내용을 링크 시키는 부분만 남아 있습니다.

사실 여기서 윈도우 폼도 Data Sources 에 있는 내용을 그대로 드래그 해서 배치가 가능해 집니다. 참 편하게 변했죠 ^^.. 하지만 윈도우 폼이 기존에 있다고 가정하고 해보겠습니다.

이때 방법은 두가지로 나눠 집니다.
윈도우 폼에 드래그 해서 링크 시키는 방법과 Properties 창에서 직접 선택해서 넣는 방법으로 나눠 집니다.
사용자 삽입 이미지
위에서 보는 것과 같이 Title 부분에 TitleOfCourtesy라는 부분은 연결시키고 있습니다.
원래 있는 컨트롤에 가져 드래그 해서 가져 가게 되면 위와 같이 커서 모양이 생기게 됩니다.

아래는 직접 메뉴에서 선택한 부분입니다.
사용자 삽입 이미지
해당 컨트롤을 선택하고 DataBindings를 펼친후 Text 부분에서 해당 테이블의 컬럼을 선택해 주고 있습니다. 최초 선택시에는 Other Data Sources 라는 항목만 보이게 되지만 두번째 부터는 위와 같이 employeesBindingSource 라는 항목이 보이게 됩니다.

이 부분 말고도 DataSet 라는 것을 새로 추가 하면서 바로 바인딩이 가능해 지는 방법도 존재를 합니다. 물론 중간 과정들은 중복해서 나오게 되어 있습니다.
Access 파일을 사용할때도 같은 방법으로 바인딩이 가능해 집니다.


장황하게 설명 했지만 2005이상에서는 위와 같이 DB를 윈도우 폼에 연결하는 과정은 조금씩 편해 지는거 같습니다. 그 결과 세부적으로 제어 하는 코드가 어떻게 돌아 가는지 점점더 분석하기 어려워 지는건 아닌가 모르겠습니다.

지금 배우는 입장에서 조금씩 해보고 있는 중이라서 틀린 부분이 존재를 할지도 모르겠습니다. 위와 같이 구성해서 테스트해보면 바로 바인딩 되서 데이터 값이 보여 지는 것을 확인할 수 있습니다.

DB 부분을 새롭게 공부 하고 있거나 공부 내용들을 서로 공유 하고 싶으신 분은 댓글 부탁 드리구요. 잘못된 부분이 있거나 하다면 댓글로 수정 부탁 드립니다.

이상 ^^






Posted by gsi
:

ADO .NET 모델 - 기초내용

DB&XML 2007. 9. 16. 23:03 |

ADO .NET 객체 모델

ADO.NET 클래스는 크게 두 개의 컴포넌트로 나누어져 있다. 즉, 물리적인 데이터 저장소와의 커뮤니케이션을 다루는 데이터 공급자(Data Providers : 때에 따라 Managed Provider 라고도 부른다)와 실제 데이터를 나타내 주는 DataSet으로 나누어진다. 이들 두 가지 컴포넌트들은 모두 WebForm이나 WinForm과 같은 데이터 사용자(Data Consumers)와 통신을 할 수 있다.

데이터 공급자(Data Providers)
데이터 공급자 컴포넌트는 데이터 소스에 대하여 특별한 역활을 한다. .NET 프레임워크는 두개의 데이터 공급자를 포함한다. 하나는 OLE DB 데이터 소스와 통신을 하는 일반 데이터 공급자이고, 또 하나는 Microsoft SQL Server 7.0 버젼 및 그 이후 버전에 최적화 시킨 SQL Server 데이터 공급자이다. 오라클이나 DB2와 같은 기타 데이터베이스를 위한 데이터 공급자도 사용 가능할 것으로 기대된다. 또한, 개발자가 자신만의 것을 만들어 사용할 수도 있다.

.NET 프레임워크에 포함되어 있는 두 개의 데이터 공급자는 서로 동일한 객체를 포함하고 있다. 비록, 포함하고 있는 각각의 객체가 서로 다른 이름을 가지고 있고 일부 속성과 메서드가 다르지만, 이들은 동일한 객체이다. 이를 설명하기 위해서, SQL Server 공급자 객체는 SQL이라는 이름으로 시작하고(예를 들어, SqlConnection), OLE DB객체는 OleDB라는 이름으로 시작한다.(예를 들어, OleDbConnection).

Connection 객체는 데이터 소스와의 물리적인 연결을 나타낸다. Connection 객체의 속성은 데이터 공급자(OLE DB 데이터 공급자의 경우), 연결하고자 하는 데이터 소스와 데이터베이스, 그리고 연결하는 동안 사용할 문자열을 결정짓는다. Connection 객체의 메서드는 매우 간단하다. 즉, 연결을 열거나 닫고, 데이터베이스를 변경하거나 트랜잭션을 관리한다.

Command 객체는 데이터 소스에 대해 실행될 SQL 문 또는 저장 프로시저(stored procedure)를 나타낸다. Connection 객체와는 상관없이 독립적으로 Command 객체를 생성하고, 실행할 수 있다. 또한, DataSet과 데이터 소스와의 통신을 위해 DataAdapter 객체가 Command 객체를 사용한다. Command 객체는 단일 값, 한 개 또는 그 이상의 행(row) 집합, 또는 전혀 값을 리턴하지 않는 SQL 문과 저장 프로시저를 지원할 수 있다.

DataReader는 데이터 소스의 데이터 스트림을 전방향(forward-only) 및 읽기 전용으로 포함하기 위한 빠르고 오버헤드가 적은 객체이다. DataReader 객체는 코드에서 직접 생성할 수 없고, 오직 Command 객체의 ExecuteReader 메서드를 호출할 때만 생성할 수 있다.

DataAdapter는 데이터 공급자 객체들 중에서 기능적으로 가장 복합한 객체이다. DataAdapter는 Connection과 DataSet 사이의 브릿지를 제공한다. DataAdapter는 네 개의 Command 객체, 즉 SelectCommand, UpdateCommand, InsertCommand, DeleteCommand를 포함한다. DataSet을 채우기 위해서 SelectCommand를 사용하고, 다른 나머지 세 개의 객체는 변경 내용을 다시 데이터 소스에 전달할 때 사용한다.

Microsoft ActiveX Data Objects(ADO)
기능적인 측면에서, Connection과 Command 객체는 해당되는 ADO 및 대응되는 객체와 어느 정도 동일하다(주요한 차이점은 서버측 커서가 제동되지 않는다는 것이다.) 반면에, DataReader 함수는 소방 호수 커서와 같다(전방향 읽기 전용의 특성으로 인하여), ADO에서 DataAdapter와 DataSet은 동일한 것이 없다.


DataSet
DataSet은 데이터를 나타내기 위한 메모리 상주형 데이터이다. DataSet의 구조는 아래 그림과 같으며, 테이블과 테이블 사이의 관계로 구성된 관계형 데이터베이스를 간단히 나타낸 형태와 같다고 볼 수 있다. DataSet이 항상 데이터 소스와 연결되어 있지 않다는 것을 이해하는 것이 중요하다. DataSet이 가지고 있는 데이터를 어디에서 가져왔는지 알지 못하지만, 실제적으로는 여러 데이터 소스의 데이터를 포함할 수 있다.

DataSet은 DataTableCollection과 DataRelationCollection이라는 두 개의 주요한 객체로 구성된다. DataTableCollecton은 0개 또는 그 이상의 DataTable객체를 포함한다. 그리고 DataTable은 차레로 Columns, Rows, Constraints의 세 개의 컬렉션으로 구성되어 있다. DataRelationCollection은 0개 또는 그 이상의 DataRelation을 포함한다.

DataTable의 Columns 컬렉션은 DataTable을 구성하는 열(Column)을 정의한다. 그리고 ColumnName과 DataType속성, DataColumn의 속성을 사용해서, 널을 허용할 것인지 말 것인지(AllowDBNull)와 최대값의 길이(MaxLength), 그리고 값을 계산하기 위한 수식(Expression)등을 정의할 수 있다.

DataTable의 Rows 컬렉션(비어 있을 수도 있다.)은 Columns 컬렉션으로 정의된 실제 데이터를 포함한다. DataTable은 각 행(Rows)에 대해서 원래 값(original), 현재 값(current)_, 제안된 값(proposed)을 유지한다. 이와 같은 기능으로 인해 프로그래밍 작업이 매우 간단해지는 것을 알게 될 것이다.

DataTable의 Constraints 컬렉션은 0개 또는 1개 이상의 Constraint를 포함한다. 마치 관계형 데이터베이스와 같이, Constraints는 데이터의 무결성을 유지 관리하기 위해 사용된다. ADO.NET은 아래와 같은 두 종류의 제약 조건(Constraint)을 지원한다.

ForeignKeyConstraints : 관계 무결성을 유지한다(즉, 자식 행은 고아가 되지 않는다는 것을 보장)
UniqueConstraints : 데이터 무결성을 유지한다(중복된 행이 테이블에 포함되지 않는다는 것을 보장)

또한 DataTable의 PromaryKey 속성을 이용해서 개체의 무결성을 보장할 수 있다(즉, 각 행의 유일성을 보장한다.)

마지막으로, DataSet의 DataRelationCollection은 0개 또는 그 이상의 DataRelation을 포함한다. DataRelation은 한 테이블의 마스터(부모) 행으로 다른 테이블의 관련 행을 간단히 검색할 수 있도록 프로그램적인 인터페이스를 제공한다. 예를 들어, 주문(Order)이 있다면, DAtaRelation으로 관련된 주문 상세 목록(OrderDetails) 행을 쉽게 뽑아 낼 수 있다. (하지만, DataRelation 그 자체는 관계에 대한 무결성을 보장해 주지 않는다).

Posted by gsi
:

FOR XML 사용방법#1

DB&XML 2007. 9. 14. 16:59 |

상세한 내용은 온라인에 있는 MSDN을 참고 바랍니다.
http://msdn2.microsoft.com/en-us/library/ms345137.aspx


select * from joyboard_notice for xml auto, type;
>> 결과
<joyboard_notice no="1" ... category="" />
<joyboard_notice no="2" ... category="" />


SELECT (SELECT * FROM joyboard_notice FOR XML AUTO, TYPE).query(
'<doc>{
   for $c in /joyboard_notice
   return
     <Person name="{data(
$c/@id)}"/>
 }</doc>')

>> 결과
<doc>
  <Person name="jaeukan" />
  <Person name="usarabia" />
</doc>
>> joyboard_notice : 테이블 이름
>> data($c/@id) : id는 컬럼명

SELECT ID as "@id",
  Nick
FROM joyboard_notice
FOR XML PATH('Customer'), ROOT('doc')

>> 결과
<doc>
  <Customer id="jaeukan">
    <Nick>Azitro</Nick>
  </Customer>
  <Customer id="usarabia">
    <Nick>사라비아</Nick>
  </Customer>
</doc>
Posted by gsi
:

DB는 초급이라.. 아무래도 다 생소하다 ^^..

우선 로그인 페이지를 만들어 볼까 하는데.
필요한게 ID, Pass, LoginButton 이 필요할거 같다.

ID와 Pass를 입력한 후에 LoginButton을 클릭 하면,
해당 ID를 where 절에 포함해서 ID, Pass를 받아 오면 될거 같다.

OleDbDataAdapter 구문에 쿼리를 넣어서 받아 오는 코드이다.

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT ID, Pass FROM Login WHERE ID='aaa';", conn);
위에서 보는 것과 같이 aaa라는 사용자의 ID, Pass 내용을 가져 오는 구문이다.
Posted by gsi
:

DB명 : member.mdb
테이블 이름 : BookTable
테이블 내용 : ID(일련번호), Title(텍스트)

cs 파일 내용

네임 스페이스

using System.Data.OleDb;
(이것만 선언 해서 안되는거 같네욤, References 에 "System.Data"를
추가해주어야 합니다.)

OleDbConnection, OleDbDataAdapter 처리
string mdbFile = Path.Combine(AppDataPath, "d:\\member.mdb");
string connString = string.Format(
                "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", mdbFile);
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM BookTable;", conn);

DataSet 연결 (전역으로 만들어 놓는다.)

DataSet myDataSet;
adapter.Fill(myDataSet, "BookTable");

활용

ListBox에 연결시...

myListBox.DataContext = myDataSet;

... 나머지는 xaml에서 처리가능...

<StackPanel>
        <StackPanel.Resources>
            <c:IntColorConverter x:Key="MyConverter"/>

            <DataTemplate x:Key="BookItemTemplate">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="250" />
                        <ColumnDefinition Width="100" />
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Path=Title}" Grid.Column="0"
            FontWeight="Bold" />
                </Grid>
            </DataTemplate>
        </StackPanel.Resources>

        <ListBox Name="myListBox" Height="200"
      ItemsSource="{Binding Path=BookTable}"
      ItemTemplate  ="{StaticResource BookItemTemplate}"/>
        <Button Click="OnClick">Add Record</Button>
    </StackPanel>

foreach 문을 사용해서 비교 할때...

DataTable dt = myDataSet.Tables["BookTable"];
foreach (DataRow row in dt.Rows)
{
    string ss = row["Title"].ToString();
}
- "BookTable" 테이블 명이다.
- "Title" 컬럼 번호. (0, 1, 2, 인덱스도 가능하다.)

DataRow를 사용해서 Row 추가 할때...

DataTable myDataTable = myDataSet.Tables["BookTable"];
DataRow row = myDataTable.NewRow();
row["Title"] = "손병욱";
myDataTable.Rows.Add(row);  //<--이것은 DB랑은 상관없다.


위의 내용을 토대로 해서 기본 테이블에서 내용을 가져 와서 검색 하고
하는 등의 내용을 해결할 수 있을거 같다.
위의 내용을 토대로 로그인 페이지를 만들어 볼려고 한다.






 

Posted by gsi
: