GSI


use fastDectionTest
go

set nocount on

-- 테이블을 지웁니다.
drop table tb_double

-- 테이블을 생성합니다.
cteate table tb_double
(
id int identity,
ph int null
)

-- 테이블을 하나 추가해봅니다.
insert tb_double(ph) values(30)
Posted by gsi
:

DB 제작할때 쿼리 문은 항상 작성하는 습관을 들이자.
이 코드를 통해서 여러가지 테스트할때 바로바로 적용해볼 수 있도록 하기 위함이다.

[순서]
1. UDL 파일을 만들어서 DB 커넥션 문을 저장해 놓는다.
2. 쿼리 테이블을 제작
3. 필요하면 로그인 계정 추가
4. 샘플 쿼리 문을 만든다. 아래와 같이
use exam
go

-- 고객 테이블
Create Table dbo.Customers
(
 CustomerID int Identity(1,1) Primary Key Not NULL, --일련번호
 Name Varchar(25) Null, --이름
 Email Varchar(100) Null, --이메일
 RegistDate DateTime Default(GetDate()) --등록일
)
Go

--입력 예시
Insert Customers Values('홍길동', 'h@h.com', GetDate())
--출력 예시
Select * From Customers Order By CustomerID Desc
--세부출력 예시
Select * From Customers Where Name = '홍길동'
--수정 예시
Begin Tran
 Update Customers
 Set Name = '백두산', Email = 'b@b.com'
 Where Name = '홍길동' And Email = 'h@h.com'
--RollBack Tran
Commit Tran
--삭제 예시
Delete Customers Where Name = '백두산'
--검색 예시
Select * From Customers
Where Name Like '%백%' Or Email Like '%b%'

수정 및 삭제시에는 트랜을 꼭 해주는것도 좋을듯 하다.

Posted by gsi
:

DB Viewer Sample1

DB&XML 2007. 12. 4. 20:50 |

사용자 삽입 이미지

ComboBox의 내용을 토대로 해서 "업데이트" 버튼을 누르면 DataGridView에 내용을 업데이트 하는 샘플 입니다.
원래 콤보 박스의 내용을 xml이나 Collection의 객체를 사용해서 연동할려고 했지만.
역시 -.- 안되더군요. (잘몰라서, 아시는분 꼭 연락 주세요 ^^)
그래서 아래와 같이 아이템은 입력 했습니다.

사용자 삽입 이미지

"업데이트" 버튼 이벤트는 아래와 같이 처리 하였습니다.
 ComboBox의 selectedIndex의 값을 사용해서 DB의 테이블 내용과 같게 switch 로 변환해 주었습니다. (원래 이걸.. ComboBox의 DisplayMember, ValueMember를 사용할려고 했는데, ^^)

        enum enItemType { IT_C, IT_B, IT_R, IT_S };

        private string GetItemType(enItemType it)
        {
            switch (it)
            {
                case enItemType.IT_C:
                    return "C";
                case enItemType.IT_B:
                    return "B";
                case enItemType.IT_R:
                    return "R";
                case enItemType.IT_S:
                    return "S";
            }
            return "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            enItemType curit = (enItemType)comboBox1.SelectedIndex;
            string selvalue = GetItemType(curit);

            this.itemTableAdapter.FilterItemTypeToFill(this.testDataSet.item, selvalue);
        }

string selvalue = GetItemType(curit);

이 코드를 통해서 selvalue에 나오는 값은 해당 테이블의 값이 생성되게 된다.

이걸 사용해서... 쿼리 문에 입력해 줍니다.
 this.itemTableAdapter.FilterItemTypeToFill(this.testDataSet.item, selvalue);

[참고]

Query Builder 내용은 아래와 같이 하면 됩니다.
SELECT   item_code, item_detail, buy_select,
FROM      item
WHERE   (cate_Num = @catenum)   <-- 이걸로 처리 해야 입력하는 값에 따른 리스트가 나옴.
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
:

사용자 삽입 이미지

DB를 생성한 후에 GridView 등에서 사용할때 위와 같이 막혀 있는 경우가 종종 있다.
나만 그런가 하고 DB를 수없이 바꿔 보고 해봤지만.
결국은 다른데 문제가 있었다.

1. DB를 생성한 후에 기본키 생성이 안되어 있을때.
2. Configure Data Source 창에서 기본키가 Select 되지 않았을때.

이럴 경우 위와 같이 화면이 나오게 된다.
Posted by gsi
:

[DB 테이블 내용]

NoteDB
   > 테이블
      >note(dbo.note)
         nid : int : No null
         name : varchar(20) : null
         content : text : null
         email : varchar(32) : null
         date : datetime : null

[저장 프로시저 내용]

USE [NoteDB]
GO
/****** 개체:  StoredProcedure [dbo].[sp_AddNote]    스크립트 날짜: 09/27/2007 01:57:39 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO

ALTER Procedure [dbo].[sp_AddNote]
(
    @Name   varchar(50),
    @Content  varchar(400),
    @Email      varchar(50)
)
AS

INSERT INTO Note
(
    name, content, email, date
)
VALUES
(
    @Name, @Content, @Email, getdate()
)

[코드 내용]

//커텍션 스트링 지정
string source = @"Data Source=GSI;Initial Catalog=NoteDB;Persist Security Info=True;User ID=sa;Password=****";
//커넥션 개체 생성
SqlConnection conn;
conn = new SqlConnection(source);
//커넥션 오픈
conn.Open();

//저장 프로시저 오픈 및 값 저장
SqlCommand cmd = new SqlCommand("sp_AddNote", conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param1 = new SqlParameter("@Name", SqlDbType.VarChar, 50);
param1.Value = name; //컨트롤로 부터 이름 저장
cmd.Parameters.Add(param1);

SqlParameter param2 = new SqlParameter("@Content", SqlDbType.VarChar, 400);
param2.Value = content; //컨트롤로 부터 컨텐트 저장
cmd.Parameters.Add(param2);

SqlParameter param3 = new SqlParameter("@Email", SqlDbType.VarChar, 50);
param3.Value = email; //컨트롤로 부터 이메일 저장
cmd.Parameters.Add(param3);

//
cmd.ExecuteNonQuery();

//기타 내용 추가 하기

//커넥션 닫기
conn.Close();

Posted by gsi
:

SqlDataReader 사용법

DB&XML 2007. 9. 27. 01:36 |

DB 테이블 내용
NoteDB
   > 테이블
      >note(dbo.note)
         nid : int : No null
         name : varchar(20) : null
         content : text : null
         email : varchar(32) : null
         date : datetime : null

위의 내용은 SQL DB 내용을 요약한 것입니다.
한줄 짜리 메모용으로 사용되어질 테이블 내역입니다.

위의 내용을 SqlDataReader를 사용해서 접근하고 데이터를 가져 오는 방법을 기술하였습니다.

//커넥션 스트링을 지정합니다.
string source = @"Data Source=GSI;Initial Catalog=NoteDB;Persist Security Info=True;User ID=sa;Password=****";

//커텍션 스트링을 사용해서 SqlConnection을 생성합니다.
SqlConnection conn;
conn = new SqlConnection(source);

//커텍션을 오픈합니다.
conn.Open();

//SqlDataReader 용 객체를 가져 옵니다.
//이때 쿼리문을 커넥션에 적용해서 값을 가져 오게 됩니다.
SqlDataReader reader = conn.ExecuteReader("SELECT * FROM note");

//아래의 코드는 웹에서 Response를 사용해서 값을 가져 오는 방법입니다.
Response.Write("<td>" + reader["nid"] + "</td>");
Response.Write("<td>" + reader["name"] + "</td>");
Response.Write("<td>" + reader["content"] + "</td>");
Response.Write("<td>" + reader["email"] + "</td>");
Response.Write("<td>" + reader["date"] + "</td>");

>>위와 같이 reader["컬럼이름"]를 사용해서 값을 가져 올 수 있습니다.

//커넥션을 닫습니다.
conn.Close();

Posted by gsi
:

XmlDataProvider 를 Blend에서 선언할때는 특정 경로를 통해서 입력 하게 되어 있다.
그것을 xaml 파일에서 바꾸는 방법은 잘 모르겠고,

템플릿 디자인 할때는 Blend에서 바로 적용해서 해보는게 편하니 그렇게 해야 할거 같다.

해당 주소에 대한 xml 파일 정보를 읽어 오기 위해서 아래와 같이 작성하였다.

[xaml]
<XmlDataProvider x:Key="memberDS" d:IsDataSource="True" Source="http://localhost/azit/tazit/member.xml"/>

[cs]
private void OnClick(object sender, System.Windows.RoutedEventArgs e)
{
 XmlDataProvider provider = this.Resources["memberDS"] as XmlDataProvider;
 if(provider != null) provider.Source = new Uri(UrlText.Text);
}

1. xaml 파일의 Source 부분은 당장 없어도 이상은 없다.
2. UrlText.Text 부분은 텍스트 에디터를 입력 받는 컨트롤이다.
3. 버튼 이벤트를 통해서 Url 경로를 넘겨 주고 자동으로 로딩되게 처리해봤다.
Posted by gsi
:

본 내용은 클라이언트 xsl 적용 방법 입니다.

[categories.xml]

<?xml version='1.0' ?>
<?xml-stylesheet type='text/xsl' href='categories.xsl'?>
<categorylist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
 <sql:query>
  SELECT categoryid, categoryname
  FROM categories
  FOR XML AUTO, ELEMENTS
 </sql:query>
</categorylist>

[categories.xsl]
<?xml version='1.0' ?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <xsl:template match='/'>
    <BODY>
      <TABLE>
        <TR>
          <TD><B>Click a Product Category</B></TD>
        </TR>
        <xsl:for-each select='categorylist/categories'>
          <TR>
            <TD>
              <A>
                <xsl:attribute name='HREF'>
                  Products.xml?categoryid=<xsl:value-of select='categoryid'/>
                  &amp;contenttype=text/html
                </xsl:attribute>
                <xsl:value-of select='categoryname'/>
              </A>
            </TD>
          </TR>
        </xsl:for-each>
      </TABLE>
    </BODY>
  </xsl:template>
</xsl:stylesheet>
Posted by gsi
:

XML 템플릿 사용

XML에서 템플릿(template)은 데이터를 처리하기 위해 질의문을 미리 생성해 놓은 문서를 말한다. 사용자가 직접 서버에 URL 질의를 입력해서 데이터를 검색하는 것보다 XML 템플릿을 이요하면 좀더 안정적이고, 제어 가능한 환경을 만들 수 있다. 템플릿은 데이터베이스에서 데이터를 검색하기 위한 질의를 하나 이상 포함하고 있고, 그 결과는 호출한 브라우저나 클라이언트 애플리케이션에서 보낸다. 템플릿은 XML-SQL 네임스페이스를 기반으로 하는 XML문서다.

HTTP와 템플릿을 사용하기 위해서 가상 이름에 템플릿 파일을 저장하고 템플릿에 접근하기 위해 URL을 통해 템플릿 파일에 접근할 수 있다. 예를 들면 products.xml이란 파일명으로 저장한 템플릿 파일이 있다면 다음과 같은 URL을 통해 접근할 수 있다.

템플릿을 사용하려면 가상 이름에 템플릿 질의 허용을 체크해 놓아야 한다. IIS에 SQL XML 구성 지원 MMC 스냅인 툴에서 설정 탭의 템플릿 질의 허용을 체크하는 것으로 해당하는 가상 디렉토리에 템플릿 질의를 허용할 수 있다.

템플릿 생성과 사용
기본적으로 XML 템플릿의 구성은 XML 문서와 동일한 구조다. 다만 SQL문을 포함하고 있다는 점이 다르다. SQL 문을 사용하기 위해서 최상위 요소에 'sql' 네임스페이스를 지정하고 <query> 요소를 사용한다. 다음은 노스윈드(northwind) 데이터베이스로부터 제품목록을 보여 주는 템플릿을 생성한 예다.

<?xml version='1.0'?>
<categorylist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
      <sql:query>
            SELECT categoryid, categoryname
            FROM categories
            FOR XML AUTO, ELEMENTS
      </sql:query>
</categorylist>

템플릿 가상 이름(templates)을 지정한 곳(c:\sqlroots\northwinddata\)에 이 제폼 목록 템플릿을 categories.xml로 저장한다. 이 코드에서 템플릿은 ADO를 통한 질의 템플릿을 사용하는 것과 같은 형식을 가진다. 템플릿에 접근할 때 <query> 태그는 XML 데이터를 처리하며, 수행한 질의 결과는 호출한 곳으로 반환한다. 다음은 XML 템플릿을 IIS 웹 서버를 통해 실행하게 된다.

이 코드를 인터넷 웹 브라우저에서 실행해 보길 바란다.
원하는 결과가 나왔다면 다행이지만..
HTTP:500 내부 서버 오류 라는 말이 나오게 되면 xml 파일의 이상이다.

템플릿 확장
템플릿을 확장하는 방법으로 파라미터 추가가 있다. 파라미터는 사용자가 하나 이상의 다앙햔 결과를 볼 수 있게 한다. 예를 들면, 템플릿을 파라미터를 받을 수 있게 생성하고, 사용자가 CategoryID 파라미터를 넘겨 주면 제품 목록 중 특정 제품의 상세 정보를 나타나게 작성할 수 있다. 파라미터는 템플릿 헤더에 위치하고, <header> 태그를 사용해서 정의한다. 각 파라미터는 <param> 태그를 사용해 정의할 수 있다. 다름은 파라미터를 사용해서 카테고리 번호를 넘겨주고, 해당 카테고리의 제품 목록을 출력하는 XML 템플릿이다.

<?xml version='1.0'?>
<productlist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
      <sql:header>
            <sql:param name='categoryid'>1</sql:param>
      </sql:header>
      <sql:query>
            SELECT productid, productname, unitprice
            FROM products WHERE categoryid = @categoryid
            FOR XML AUTO, ELEMENTS
      </sql:query>
</productlist>

products.xml 템플릿 문서에서는 categoryid 기본값으로 1을 지정한다 .파라미터를 인식하려면 <param> 태그를 name 속성으로 사용해야 한다. 이 이름을 @ 기호와 함께 사용해서 SQL 질의에서 사용할 수 있다. 파라미터화한 템플릿으로 데이터에 접근하기 위해 URL 질의 스트링에 파라미터를 지정한다. 다음은 카테고리 번호 2를 파라미터로 전달하고, 템플릿을 실행하는 코드이다.

categoryid를 2로 입력된 하면을 볼 수 있다.

Posted by gsi
:

저번장까지 IIS를 설치하고 가상 디렉토리까지 마무리 했습니다.
이제 HTTP 를 사용해서 어떻게 사용하는 지에 대해서 간단하게 짚고 넘어 가겠습니다.

URL 질의 사용
가상 디렉토리가 제대로 설정되어 있는지 확인하는 간단한 방법은 URL 질의를 가능하게 한 후, XML 가능 브라우저를 사용해서 질의문을 실행해 보는 것입니다. URL에서 데이터를 추출할 경우 질의와 다른 설정이 적절한지 확인하기 위해 파라미터를 이용할 수 있다. 이 파라미터는 URL 질의 문자열에 표준 형식을 사용해서 보낼 수 있다. URL과 파라미터를 분리하려면 ? 기호를 사용하고, 여러개의 파라미터를 보낼 때는 각 파라미터를 & 기호를 이용해서 분리한다. 다음 URL 포맷은 2개의 파라미터를 이요해서 URL로 데이터에 접근할 때 사용한 예입니다.

URL 질의를 이용해서 FOR XML 질의를 포함하는 SQL 파라미터를 지정할 수 XML 문서를 추출할 수 있다. FOR XML 질의의 결과가 잘 구성한 XML 문서를 반환하기 보다 XML 데이터를 반환하기 때문에 최상위 요소를 URL에 반드시 지정해야 한다. 그래서 최상위 요소를 정확히 지정하거나 최상위 요소 파라미터를 지정해 처리할 수 있다.

다음 예제는 Northwind 데이터베이스의 Products 테이블로부터 데이터를 검색하는 것으로 사용하는 URL 질의다. 최상위 요소는 SQL 파라미터의 일부로 포함한다. 최상위 요소는 <catalog>로 임의의 요소를 정의하였다.

http://localhost/northwinddata?sql=SELECT+'<catalog>';SELECT+*+
FROM+products+FOR+XML+AUTO;SELECT+'</catalog>
또는
http://localhost/northwinddata?sql=SELECT+*+FROM+products+FOR+XML+AUTO&
root
=catalog

위의 내용을 인터넷 브라우저에서 확인 가능하다. 한번씩 해보길 바란다.

URL 질의를 하나하나 SQL문으로 작성하는 것은 상당히 번거로운 작업이다. 이러한 번거로움은 T-SQL의 EXECUTE 구문이나 ODBC를 호출해 저장 프로시저를 수행하면 해결할 수 있다. 효율적으로 URL 질의를 사용할 수 있을 뿐만 아니라 보안 측면에서도 훨씬 유리하다. 실제로 UTL질의 문을 한번 살펴 보자.

사용자 삽입 이미지
URL 질의에서 저장 프로시저를 호출할 수 있게, EXECUTE 구문과 저장 프로시저 이름, 파라미터를 브라우저 주소란에 입력한다.

결과는 직접 확인 바랍니다.



 

Posted by gsi
:

테스트 환경 : SQL 2000 입니다.

IIS 가상 디렉토리를 통한 데이터베이스 처리
SQL 서버 2000의 HTTP 처리를 위한 툴은 MMC에 스냅인 된 IIS에 SQL XML 구성 툴을 사용한다. SQL XML 지원 구성을 실행하려면 [시작]>[프로그램]>[Microsoft Sql server]>[IIS에 SQL XML 지원 구성]을 차례로 선택하여 실행한다.

사용자 삽입 이미지

IIS에 SQL XML 지원 구성을 실행하면 관리창을 볼 수 있다. 관리창을 이용하면 IIS의 가상 디렉토리로 이루어진 SQL 서버 2000의 XML 처리를 생성하고 관리할 수 있다. 관리 창을 수행한 후, 서버를 확장하면 로컬 컴퓨터에 구성한 웹 사이트는 왼쪽창에 나타난다. 왼쪽 창의 IIS 가상 디렉토리 관리를 선택해 서버를 관리할 수 있고, 원격 시스템 동작 메뉴를 이용해 등록할 수도 있다.

새로운 가상 디렉토리를 설정하려면 먼저 처리할 웹 사이트를 선택해야 한다. 기본 웹 사이트나 [동작] 메뉴를 선택한 후, [새로 만들기]>[가상 디렉토리]를 선택한다. 새로운 가상 디렉토리를 구성하는 대화 상자가 열린다.
사용자 삽입 이미지

가상 디렉토리 이름과 경로 지정
가상 디렉토리는 URL을 처리 하는 부분이다. 이름은 인트라넷 환경 형식인 'http://서버경로/가상디렉토리' 형태로 만든다. 가상 디렉토리 부분에는 IIS 서버 URL 중 도메인 부분을 지정한다.

자신의 시스템을 로컬에서 사용할 경우 http://localhost/northwinddata 형태로 사용할 수 있다. [로컬 경로]에서는 가상 디렉토리 지정된 물리적인 위치의 전체 경로를 지정할 수 있다.
사용자 삽입 이미지

가상 디렉토리 보안 설정
SQL 서버 2000의 인증 방법은 크게 두 가지로 나눌 수 있다. 첫번째는 윈도우 서버의 운영체제와 SQL 서버간의 통합한 인증 절차다. 운영체제 차원에서 인증 과정을 통과하면 자동적으로 SQL 서버의 인증도 통과하는 방식이다. 두번째는 운영체제와 SQL 서버의 분리한 인증방법으로, SQL 서버에서 인증 과정을 별도로 관리하는 것을 말한다. 어떤 인증 방법을 사용해도 상관없이, 설정한 인증 방법에 따라[보안] 설정을 하면 된다.
사용자 삽입 이미지

데이터 원본 지정
새 가상 디렉토리의 등록 정보 대화 상자의 [데이터 원본] 탭에서 SQLISAPI 애플리케이션에 데이터를 제공할 [SQL Server]와 [데이터베이스]를 지정한다. 데이터를 저장할 서버를 지정해야 하고, 데이터가 있는 데이터베이스 이름도 지정한다.
사용자 삽입 이미지

데이터 접근 지정
가상 디렉토리를 통한 데이터접근할 수 있게 설정하기 위해서 새 가상 디렉토리 등록 정보의 [설정]탭을 이용한다.

설정은 네 가지 중 선택할 수 있다. 모든 질의 방식을 지원받으려면 네 가지를 모두 체크하면 된다.

  • URL 질의 허용
  • 템플릿 질의 허용
  • XPath 허용
  • POST 허용

사용자 삽입 이미지

가상 이름(Virtual Name) 생성
가상 디렉토리 등록 정보 대화 상자의 [가상 이름] 탭에서 디렉토리를 위한 가상 이름을 설정할 수 있다. 가상 이름은 템플릿 스키마 또는 데이터베이스 객체를 지정하기 위해 URL에서 사용한다. 가상 이름은 템플릿, 스키마, 데이터베이스 객체형으로 가상 이름의 [새로 만들기]를 선택해 원하는 가상이름, 유형, 경로를 생성할 수 있다.
사용자 삽입 이미지
지정한 폴더에 XML 템플릿과 스키마를 포함하게 가상 이름을 사용할 수 있다. 예를 들면 Northwind data 가상 디렉토리 애플리케이션에서 products.xml 이라고 정의한 템플릿을 포함하는 폴더에 가상 이름 templates를 지정할 수 있다. 이 템플릿은 http://localhost/northwinddata/templates/products.xml과 같은 URL을 통해 접근할 수 있다.

여기까지 해서 설정이 모두 완료가 되었습니다. IIS(인터넷 정보 서비스)를 열어 보면 가상 디렉토리가 설정되어져 있는 것을 볼 수 있습니다.

이상..

Posted by gsi
:

SQL 서버 2000에서 제공하는 새로운 기능 중 HTTP를 이용해서 XML 데이터에 접근하는 방법을 알아본다. HTTP를 이용해서 인트라넷이나 인터넷 기반 애플리케이션을 구축할 수 있다. 이 방법은 Micorsoft IIS의 가상 디렉토리를 구축하는 방법으로 XML 데이터를 처리하거나 다른 애플리케이션에 쉽게 적용할 수 있다. HTTP로 데이터를 처리하는 기능으로 ASP 애플리케이션보다 적은 코드를 이용하면서도 쉽고 빠르게 데이터 중심적인 웹 사이트를 구축할 수 있다.

XSL 스타일시트를 XML 데이터에 적용해서 HTML 문서로 변형한 후, 브라우저 기반 클라이언트로 전송하거나 WML과 같은 다른 문서 형태로 변환해서 WAP 형식으로 휴대폰, PDA 등에 사용이 가능해 진다.

SQL 서버의 HTTP 처리 구조
SQL 서버는 SQLISAPI(SQL 서버에서 제공하는 ISAPI 애플리케이션)FMF DLDYDGOTJ ㅗㅅ세FMF CJFLGKSEK. IIS에 가상 디렉토리 루트를 생성한 후, HTTP URL을 이용하면 SQL 서버의 데이터베이스에 접근할 수 있다. SQLISAPI 애플리케이션은 SQL 서버 2000의 OLE-DB 공급자를 이용해서 클라이언트로 XML이나 HTML 데이터를 보낸다.

SQL 서버를 IIS 웹 서버와 동일한 시스템에 구축할 수 있다. SQL 서버에는 데이터를 테이블에 저장할 수 있고, 클라이언트로부터 IIS 웹 서버에 의해 질의문을 전송받고, 전송받은 질의문을 실행해서 질의한 결과의 데이터를 XML 문서의 형태로 IIS 웹 서버를 통해 클라이언트에게 전송한다. 클라이언트 애플리케이션은 다음과 같이 네 가지의 방법 중 하나로 데이터를 요청할 수 있다.

  • FOR XML 질의문을 질의 스트링으로 URL에 보내는 방법
  • XML 질의 템플릿을 ISAPI 애플리케이션에 포스팅 하는 방법
  • XML 질의 템플릿을 웹 서버의 가상 루트에 지정하는 방법
  • XML 스키마를 웹 서버의 가상 루트에 정의하는 방법





 

Posted by gsi
:

Connection의 이해

Connection은 데이터 저장소와 .NET 응용 프로그램 사이의 물리적 커뮤니케이션을 다른다. Connection 객체는 데이터 공급자의 한 부분이기 때문에. 각각의 데이터 공급자는 자신만의 Connection 객체를 구현한다. .NET 프레임 워크가 제공하는 두 개의 데이터 공급자는 System.Data.OleDB 네임스페이스에서 OleDbconnection을 구현하고, System.Data.SqlClient 네임스페이스에서 SqlConnection을 구현한다.

OleDbConnection은 보통 OLE DB를 사용하는데, Microsoft SQL Server를 포함하여 다른 OLE DB 공급자에서도 사용할 수 있다. SqlConnection 은 OLE DB 공급자를 거치지 않고 직접 SQL Server로 접속하기 때문에, SQL Server일 경우에 효과적이다.


Connection을 직접 생성할 수도 있지만. 여기서는 테스트를 쉽게 하기 위해서
DataAdapter를 사용했다.


OleDbDataAdapter 또는 SqlDataAdapter를 사용해서 공급자를 선택하고 서버명, 로그인 정보를 입력하고 원하는 데이터 베이스를 선택 했다.

그리고 쿼리 생성기를 사용해서 해당 테이블의 컬럼 정보를 선택해서 생성하였다.

이렇게 하면 디자인 뷰의 화면 하단에 oleDbDataAdapter1, oleDbConnection1 또는 sqlDataAdapter1, sqlConnection1 이 생기게 된다.

Connection을 이해 하기 위해서 두개의 ConnectionString를 모두 추가 하였고 이것을 사용해서 테스트를 진행 했다.

두개의 커넥션을 모두 받을수 있는 System.Data.IDbConnection 변수를 하나 생성하였다.
private System.Data.IDbConnection myconnection;

그리고 Ole 또는 Sql 을 선택해서 myconnection에 설정하게 된다.
myconnection = this.oleDbConnection1;

myconnection 은 아래와 같은 3개의 정보를 담고 있다.
1. myconnection.ConnectionString.ToString();
2. myconnection.Database.ToString();
3. myconnection.ConnectionTimeout.ToString();



커넥션을 열고 닫고 하는 과정은 아래와 같다.
this.myconnection.Open();  //커넥션을 오픈한다.
MessageBox.Show(this.myconnection.State.ToString()); //커넥션 상태를 알아본다.
this.myconnection.Close();  //커넥션을 닫는다.


[관련내용]
ConnectionString 속성
ConnectionString은 어느 Connection 객체이든지 간에 가장 중요한 속성이며, 사실상 나머지 속성은 읽기 전용이다. 이들 나머지 속성들은 ConnectionString이 제공한 값에 의해 생성된 Connection에 의해 설정된다.

모든 ConnectionString은 동일한 포멧을 가진다. 그것은 키워드와 값이 한 세트로 구성되고 세미콜론(;)으로 구분되며, 전체가 작은 따옴표나 큰 따옴표로 쌓여 있다.

"keyword=value;keyword=value"

키워드 이름은 대소문자 구별을 하지 않는다. 그러나 데이터 소스에 의존하는 값은 그렇지 않을 수 있다. 작은 따옴표 혹은 큰 따옴표의 사용은 문자열의 기본 규칙을 따른다. 예를 들면, 데이터베이스의 이름이 Becca's Data이면, ConnectionString은 큰 따옴표를 써야 한다. "Database=Becca's Data", 'Database=Becca's Data' 는 에러를 일으킬 것이다.

동일한 키워드를 여러번 사용한다면 마지막 인스턴스가 사용될 것이다. 예를 들어, ConnectionString에 databast=Becca's Data ; database=Northwind"를 준다면, 초기 데이터베이스는 NorthWind가 될 것이다. 다중 인스턴스를 사용하는 것이 구문 에러를 발생하지 않는 가장 이상적인 방법이다.

ConnectionString 형식은 어렵지 않지만, 내용은 데이터 공급자마다 항상 고유하기 때문에 내용을 정의 하는 것이 어려울 수 있다. 그러나 [데이터 연결 속성] 대화 상자를 이용해서 디자인 타임 연결을 생성하고, 그 값을 복사함으로써 쉽게 작업을 할 수 있다.

ConnectionString은 연결이 닫힐 때만 설정할 수 있다. 설정될 때 Connection 객체는 문자열 문법을 검사하고 나머지 속성(앞에서 읽기 전용이고 했던 것을 기억할 것이다)들을 설정할 것이다. ConnectionString은 연결이 열려 있을 때에 완전히 확인할 수 있다. 만약 연결이 확인되지 않거나 제공하지 않는 속성을 발견하면 오류가 발생할 것이다(객체가 사용될 때 의존하고 있는 OleDbException과 SqlDbException 둘 중 하나에서 발생한다.).


이상...
이론 내용은 Microsoft ADO.NET Step by Step 내용 2장에서 발췌 하였음...






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
: