GSI

// DataGridView 객체 얻어 오기
DataGridView dgv = sender as DataGridView;
if (dgv == null)
    return;

// 셀단위로 선택된 것이 있는지 찾는다. 하나도 없을때 리턴
if (dgv.SelectedCells.Count == 0)
    return;

// DB와 연결되어 있을때. DataSet의 테이블 정보를 가져온다.
DataTable dtItem = azitro_testDataSet.Tables[0];
// DataRow를 가져 오기 위해서 DataGridView의 선택된 셀정보를 가져와서
// RowIndex를 리턴해 준다.
// RowIndex의 값을 사용해서 DataRow를 구한다.
DataRow rwItem = dtItem.Rows[dgv.SelectedCells[0].RowIndex];

// Row의 셀 정보를 가져온다. (DB 내용)
string strCatenum = rwItem["cate_Num"].ToString();
string strCatedep = rwItem["cate_dep"].ToString();
string strCatesel = rwItem["cate_sel"].ToString();
string strsiImg = rwItem["icon_img"].ToString();

txtSelName.Text = rwItem["item_name"].ToString();
txtSelContents.Text = rwItem["item_contents"].ToString();

// DB에 있는 내용을 사용해서 폴더 경로를 구한다.
string filepath;
filepath = Application.StartupPath
    + "\\itemlist\\"
    + strCatenum + "\\"
    + strCatesel + "\\"
    + strsiImg + ".png";

// 파일이 존재 하는지 검사한다.
if (File.Exists(filepath))
{
    // 이미지를 연결하고 화면에 출력한다.
    picItemImage.Image = Image.FromFile(filepath);
}
else
{
    // 이미지가 없을때 null 처리
    picItemImage.Image = null;
}

Posted by gsi
:

DataSet을 생성하고 그곳에 있는 특정 Row의 값을 가져 와서
Row 내부에 있는 Column의 정보를 가져 올때 아래와 같이 하면 됨.

DataTable dtItem = azitro_testDataSet.Tables[0];  // DataSet에서 DataTable을 가져옴
DataRow rwItem = dtItem.Rows[0];  // DataTable에서 DataRow을 가져옴.

string strCatenum = rwItem["cate_Num"].ToString(); // DataRow의 해당 컬럼 정보를 가져옴.

Posted by gsi
:

DB를 잘 알지 못하는 상황에서 VS2008 beta 2를 사용하다 보면, 몇가지 문제에 부딫히게 됩니다.
ADO.NET를 사용하게 되면 DB를 접근해서 데이터를 가져 오는 상황이 여러개의 라인으로 처리 해야 합니다.
물론 그것을 이용하면 쉬울지도 모르겠습니다.
하지만 VS2008 beta 2 를 사용하다 보면 DataSet를 생성하게 되면 몇개의 파일이 생깁니다.
사용자 삽입 이미지
예를 들어서 Database1DataSet로 생성했다고 하면 아래와 같은 파일이 생깁니다.

이것을 어떻게 사용하냐.. 빌더를 하고 나면 ToolBox에 컨트롤이 몇개가 생기게 됩니다.


사용자 삽입 이미지
이것을 WindowForm에 추가를 시킵니다.







몰론 이전에 DB Table를 하나 만들어야 됩니다.
아래와 같이 간단하게 하나 만들어서 추가해 보겠습니다.
DataSet의 Query 문까지 같이 ...
사용자 삽입 이미지
아래의 화면에서 xsd 쪽으로 Test01의 Table를 드래그 해서 놓으면 테이블이 화면에
생성 됩니다.
사용자 삽입 이미지
이 화면은 Fill,GetData()라는 쿼리 문이 자동으로 생성 되게 되는데요. 그림과 같이 ScalarQuery(@userid) 라는 항목을 같이 넣어 봤습니다.

ScalarQuery(@userid) 해당 아이디가 들어 왔을때 string형태로 원하는 테이블을 뽑아낼 수 있습니다.

여기서는 로그인 폼으로 사용하는 것이라서 userid가 들어 오면 pass를 뽑아 주도록 해보았습니다.
사용자 삽입 이미지


이제 형태가 다 갖추어 졌으니. 아래와 같은 코딩으로 사용하면 됩니다.

string passStr = test01TableAdapter1.ScalarQuery("gsi451").ToString();

여기서 test01TableAdapter1은 xsd 파일을 통해서 생성된 컨트롤 이며, WinForm에 추가한 내용입니다.

내용이 동영상으로 올려야 좋을거 같은데요.
문서상으로 할려니 순서가 조금 뒤죽박죽이네요..
이 부분에 대한 궁금한 내용은 연락 주시면. 답변 드릴께요.

그럼.. 수고하세요.

Posted by gsi
:

link : http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconnavigatingrelationshipbetweentwotables.asp

DataRelation의 주요한 기능 중 하나는 DataSet 내의 한 DataTable에서 다른 DataTable로 이동을 허용한다는 것입니다. 따라서, 연관된 DataTableDataRow가 하나 주어지면 연관된 다른 DataTable에 있는 모든 연관된 DataRow 개체를 검색할 수 있습니다. 예를 들어, 고객 테이블과 주문 테이블 사이에 DataRelation을 만든 다음 DataRow.GetChildRows를 사용하여 특정 고객 행에 대한 모든 주문 행을 검색할 수 있습니다.

다음 코드 예제에서는 DataSetCustomers 테이블과 Orders 테이블 사이에 DataRelation을 만들고 각 고객에 대한 모든 주문을 반환합니다.

[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);
foreach (DataRow custRow in custDS.Tables["Customers"].Rows)
{
  Console.WriteLine(custRow["CustomerID"]);
  foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
    Console.WriteLine(orderRow["OrderID"]);
}

다음 예제에서는 이전 예제를 기반으로 네 개의 테이블을 모두 연관시키고 이들 관계를 탐색합니다. 이전 예제에서와 마찬가지로 CustomerIDCustomers 테이블을 Orders 테이블에 연관시킵니다. Customers 테이블의 각 고객에 대해 Orders 테이블의 모든 자식 행이 결정되어 특정 고객의 주문 개수와 이들의 OrderID 값이 반환됩니다.

확장된 예제에서는 OrderDetailsProducts 테이블의 값도 반환됩니다. Orders 테이블은 각 고객 주문에 대해 주문된 제품과 수량을 결정하기 위해 OrderID를 사용하여 OrderDetails 테이블에 연관됩니다. OrderDetails 테이블에는 주문된 제품의 ProductID만 있으므로 OrderDetailsProductName을 반환하기 위해 ProductID를 사용하여 Products에 연관됩니다. 이 관계에서 Products 테이블은 부모 테이블이고 Order Details 테이블은 자식 테이블입니다. 그 결과, OrderDetails 테이블을 반복하여 검색할 때는 GetParentRow가 호출되어 연관된 ProductName 값이 검색됩니다.

CustomersOrders 테이블에 대해 DataRelation을 만들면 createConstraints 플래그(기본값은 true)의 값이 지정되지 않습니다. 이런 경우에는 Orders 테이블의 모든 행이 부모 테이블인 Customers에 존재하는 CustomerID 값을 가지고 있다고 가정합니다. Customers 테이블에 없는 CustomerIDOrders 테이블에 있으면 ForeignKeyConstraint에 의해 예외가 throw됩니다.

부모 열에 포함되어 있지 않은 값이 자식 열에 있는 경우 DataRelation을 추가할 때 createConstraints 플래그를 false로 설정합니다. 예제에서는 Orders 테이블과 OrderDetails 테이블 사이의 DataRelation에 대해 createConstraints 플래그가 false로 설정됩니다. 이렇게 되면 응용 프로그램에서는 런타임에 예외를 발생시키지 않고 OrderDetails 테이블의 모든 레코드와 Orders 테이블 레코드의 일부분만 반환할 수 있습니다. 확장된 예제는 다음과 같은 형식의 출력을 생성합니다.

      Customer ID: NORTS
        Order ID: 10517
              Order Date: 4/24/1997 12:00:00 AM
                 Product: Filo Mix
                Quantity: 6
                 Product: Raclette Courdavault
                Quantity: 4
                 Product: Outback Lager
                Quantity: 6
        Order ID: 11057
              Order Date: 4/29/1998 12:00:00 AM
                 Product: Outback Lager
                Quantity: 3

다음 코드 예제는 확장된 예제로서 OrderDetailsProducts 테이블의 값과 반환되고 있는 Orders 테이블 레코드의 일부분만 반환합니다.

[C#]
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);

DataRelation orderDetailRel = custDS.Relations.Add("OrderDetail",
                     custDS.Tables["Orders"].Columns["OrderID"],
                     custDS.Tables["OrderDetails"].Columns["OrderID"], false);

DataRelation orderProductRel = custDS.Relations.Add("OrderProducts",
                     custDS.Tables["Products"].Columns["ProductID"],
                     custDS.Tables["OrderDetails"].Columns["ProductID"]);

foreach (DataRow custRow in custDS.Tables["Customers"].Rows)
{
  Console.WriteLine("Customer ID: " + custRow["CustomerID"]);

  foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
  {
    Console.WriteLine("  Order ID: " + orderRow["OrderID"]);
    Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]);

    foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRel))
    {
        Console.WriteLine("\t   Product: " + detailRow.GetParentRow(orderProductRel)["ProductName"]);
        Console.WriteLine("\t  Quantity: " + detailRow["Quantity"]);
    }
  }
}
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
: