SqlDataReader vs SqlDataAdapter 

              연결 vs 비연결

 

 DB 종속적(sqlData~, oleData~)  vs DB 독립적(Dataset 앞에   sql 어쩌고가 없으니까..)

 

 SqlDataReader (매번 db 왓다갓다 해야되므로 속도가 저하된다.)

 

 질의(select *from tblAddress) 날릴때마다 db 왓다갓다 하면서 결과를 보여주는것.

 

 SqlDataAdapter (db 매번접근해야되는 횟수가 많으면 속도가 훨씬 빠르다. db 매번 접속하지 않으니까..더많이쓰임)

 

 fill 메서드가 호출되면 그이후에는 db 접속하지않는다. DataSet "select *from tblAddress" 결과가 복사되어있다.

 

이후부터는 DataSet 에서 가져와서 사용하는것이다.

 

 

 

string query = "select *from tblAddress";

// 1. 데이터 어댑터 생성

SqlDataAdapter adapter = new SqlDataAdapter(query, Properties.Resources.conStr);

            

// 2. 데이터 집합 생성 - 복사본

DataSet ds = new DataSet();

 

// 3. 데이터 채우기

adapter.Fill(ds, "tblAddress");

 

Console.WriteLine(ds.Tables["tblAddress"].Rows.Count);

 

// 4. 데이터 확인

DataTable dt = ds.Tables["tblAddress"];

for (int i = 0; i < dt.Rows.Count; i++)

 {

Console.WriteLine("{0}\t{1}\t{2}\t{3}", dt.Rows[i]["id"].ToString(),dt.Rows[i]["name"].ToString(),

dt.Rows[i]["email"].ToString(), dt.Rows[i]["age"].ToString());

 }

 


 

------------------------------------------------------------------------------------------------------------------------------

 

 

//질의가 두개 일때의 처리방법

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblTest1; select *from tblTest2;", con);

 

DataSet ds = new DataSet();

adapter.Fill(ds); // 질의가 두개일때는 임시테이블명 못준다.

            

 // 질의가 두개 일때는 아래와같이 테이블 이름을 준다...

ds.Tables[0].TableName = "tblTest1";

ds.Tables[1].TableName = "tblTest2";

 

Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

 {

for (int j = 0; j < ds.Tables[i].Rows.Count; j++)

{

Console.WriteLine("{0}\t{1}",ds.Tables[i].Rows[j]["seq"].ToString(), ds.Tables[i].Rows[j]["memo"].ToString());

}

}

 

// 테이블 1 추가

SqlDataAdapter adapter2 = new SqlDataAdapter("select *from tblAddress", con);

//DataSet ds2 = new DataSet();

 adapter2.Fill(ds, "tblAddress");

 

 Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

{

Console.WriteLine(ds.Tables[i].TableName);

 }


 

-----------------------------------------------------------------------------------------------------------

 

// 연결지향

// 리스트를 2 출력!

// 연결데이터를 안쓰는 가장큰이유.. 동일한데이터를 2번출력 없으므로..

 // 따라서 연결지향쓰는 경우는 한번만 훓어서 출력하고 싶을경우에 쓴다.

SqlConnection con = new SqlConnection(Properties.Resources.conStr);

 

SqlCommand cmd = new SqlCommand("select *from tblAddress", con);

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

            

// EOF 커서는 전진커서..뒤로 역탐색은 불가능하다.

while (reader.Read())

{

Console.WriteLine((int)reader["age"]+1);

// ★★ reader.GetInt32() : 캐스팅되서 나오는것. , 인덱스로만 접근가능하다.

Console.WriteLine(reader.GetInt32(3) + 1); 

Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 

 reader.Close();

reader = cmd.ExecuteReader();

 

while (reader.Read())

 {

 Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 con.Close(); // 읽은후에는 연결종료

 reader.Close(); // reader 종료

 

// 비연결

 // 2번출력해주는게 쉽다.빠르다. (DatasSet 들어있으니까..)

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblAddress", con);

DataSet ds = new DataSet();

adapter.Fill(ds, "tblAddress");

 

// 2 출력

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

{

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}

 Console.WriteLine();

 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 

 {

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}


by 피요히코~ 2009. 2. 25. 13:17

ADO.NET


ExecuteNonQuery

ExecuteReader : SqlDataReader 반환.

 - reader 원본테이블을 가져오는게 아니라 select 결과값을 가져오는 것이다.

 - reader.FieldCount = 레코드의 전체 갯수 (배열의 count  같음)

 - 쿼리가 두개있을때 읽어 오는방법

 

cmd.CommandText = "select id, name, email from tblAddress; select count(*) from tblAddress";

while (reader.Read())

{

for (int i = 0; i < reader.FieldCount; i++)

{

Console.Write("{0}\t", reader[i]);

}

Console.WriteLine();

}

 

// 두번쨰 결과셋에 접근

if (reader.NextResult())

{

// count(*)

reader.Read();

Console.WriteLine(" 학생수(2번째select 사용): {0} ", reader[0]);

}

 reader.Close();


by 피요히코~ 2009. 2. 25. 13:16

XMLDocument 이용한 검색

 

string path = "booklist.xml";

XmlDocument doc = new XmlDocument();

doc.Load(path);

string xPath = "//book/title[../@kind='소설']";

// SelectNodes 메서드는 검색조건에 맞는 개체를 XmlNodeList 반환하고

// SelectSingleNode 메서드는 검색조건에 맞는 단한개의 XmlNode 만을 반환(ID속성일 경우 쓰임)

           

XmlNodeList nodeList = doc.SelectNodes(xPath);

for (int i = 0; i < nodeList.Count; i++)

{

string title = nodeList[i].InnerText;

Console.WriteLine(title);

}


 

XPathDocument 이용한 검색

 // [1]. XPathDocument 생성

XPathDocument xdoc = new XPathDocument("booklist.xml");

// [2]. XPathNavigator 생성 -> XML 데이터를 탐색하고 편집하기 위한 커서모델을 제공한다.

XPathNavigator xPathNavi= xdoc.CreateNavigator();

// [3]. XPathNodeIterator 생성 -> 반복기 역활

XPathNodeIterator xPathIterator = xPathNavi.Select("//booklist/book/title[../@kind='컴퓨터']");

// [4]. kind='컴퓨터' 없을 까지 돈다.

while (xPathIterator.MoveNext())

{

     XPathNavigator navigatorTitle = xPathIterator.Current;

     Console.WriteLine(navigatorTitle.Value);

}  



by 피요히코~ 2009. 2. 25. 13:15

XML 에서 속성 가져오는 방법..

            string path = "booklist.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(path);

            XmlElement booklist=doc.DocumentElement;
            XmlElement FirstBook = (XmlElement)booklist.FirstChild;

            // 1. XmlAttributeCollection 를 사용해서 속성 가져오기 
            XmlAttributeCollection attributes = FirstBook.Attributes;
            for (int i = 0; i < attributes.Count; i++)
            {
                XmlAttribute attribute = (XmlAttribute)attributes[i];
                Console.WriteLine(attribute.Name + ":" + attribute.Value);
            }

            // 2. GetAttributd() 메서드를 이용해서 속성 가져오기
            string id = FirstBook.GetAttribute("id");
            Console.WriteLine("id:"+id);
            string kind = FirstBook.GetAttribute("kind");
            Console.WriteLine("kind:"+kind);
        }



 

XML 에서 모든엘리먼트 가져오기
 
           string path = "booklist.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(path);

            XmlElement booklist = doc.DocumentElement;

          
            //// GetElementsByTagName() 으로 엘리먼트 가져오기
            XmlNodeList titleNodeList = doc.GetElementsByTagName("price");
            for (int i = 0; i < titleNodeList.Count; i++)
            {
                XmlNode titleNode = titleNodeList[i];
                XmlNodeList childNodeList = titleNode.ChildNodes;
                XmlNode textNode = childNodeList[0];
                string value = textNode.Value;
                Console.WriteLine(value);
            }



by 피요히코~ 2009. 2. 25. 13:14
string filePath = "booklist.xml";

XmlDocument doc = new XmlDocument();

doc.Load(filePath);

// 잘짜인 xml 이면은 반드시 한개의 엘리먼트가 있기때문에 XmlDocument 개체의 속성인 DocumentElement 바로 얻을 있다.

 

XmlElement booklist = doc.DocumentElement; 

 

// 첫번쨰 자식엘리먼트의 노드들의 수를 가져온다.

XmlNodeList childs = FirstBook.ChildNodes;

 

// 첫번쨰 자식엘리먼트의 카운트수 만큼 노드의 이름 내용을 보여준다.            

for (int i = 0; i < childs.Count; i++)

{

       XmlElement eChild = (XmlElement)childs[i];

      Console.WriteLine(eChild.Name + ":" + eChild.InnerText);

 }


by 피요히코~ 2009. 2. 25. 13:14

<StackPanel>

<Canvas Width="350" Height="200">

<Rectangle Canvas.Left="150" Canvas.Top="50" Stroke="Black" StrokeThickness="5"

  Fill="Azure" Width="50" Height="150">

<Rectangle.RenderTransform>

<TransformGroup>

<!--변형축이 좌측하단-->

<RotateTransform x:Name="xform1" Angle="-90" CenterX="0" CenterY="150"/>

<!--변형축이 우측하단-->

<RotateTransform x:Name="xform2" CenterX="50" CenterY="150"/>

</TransformGroup>

</Rectangle.RenderTransform>

</Rectangle>

</Canvas>

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">

<Button Name="btnBegin" Content="Begin" Margin="12"/>

<Button Name="btnPause" Content="Pause" Margin="12"/>

<Button Name="btnResume" Content="Resume" Margin="12"/>

<Button Name="btnStop" Content="Stop" Margin="12"/>

<Button Name="btnEnd" Content="Skip to End" Margin="12"/>

<Button Name="btnCenter" Content="Skip to Center" Margin="12"/>

</StackPanel>

<StackPanel.Triggers>

<!--외부에서도 Trigger가능-->

<EventTrigger SourceName="btnBegin" RoutedEvent="Button.Click">

<BeginStoryboard Name="story1">

<Storyboard>

<DoubleAnimation

Storyboard.TargetName="xform1"

Storyboard.TargetProperty="Angle"

From="-90" To="0"

Duration="0:0:5"/>

 

<DoubleAnimation

Storyboard.TargetName="xform2"

Storyboard.TargetProperty="Angle"

From="0" To="90"

Duration="0:0:5"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

 

<!--storyBoard 대한 제어 가능-->

<EventTrigger SourceName="btnPause" RoutedEvent="Button.Click">

<!--정지-->

<PauseStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnResume" RoutedEvent="Button.Click">

<ResumeStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnStop" RoutedEvent="Button.Click">

<!--초기화-->

<StopStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnEnd" RoutedEvent="Button.Click">

<!--진행단계의 마지막으로-->

<SkipStoryboardToFill BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnCenter" RoutedEvent="Button.Click">

<!--진행단계의 특정시간으로-->

<SeekStoryboard BeginStoryboardName="story1" Offset="0:0:2.5"/>

</EventTrigger>

</StackPanel.Triggers>

</StackPanel>



 


초기화면

Begin >> Pause

Skip to Center

by 피요히코~ 2009. 2. 25. 13:11

<Window.Resources>

<Style TargetType="{x:Type Button}">

<Setter Property="Width" Value="30"/>

<Setter Property="Height" Value="50"/>

<Setter Property="Background" Value="White"/>

<Setter Property="LayoutTransform">

<Setter.Value>

<ScaleTransform CenterX="15" CenterY="25"/>

                           <!--변화시길 기준좌표값-->

</Setter.Value>

</Setter>

 

<Style.Triggers>

<EventTrigger RoutedEvent="Button.MouseEnter">

<BeginStoryboard HandoffBehavior="Compose">

<!--Compose : 개체의 크기가 변할때 다른 개체를 가리지 않도록-->

<Storyboard>

<DoubleAnimation

Storyboard.TargetProperty="LayoutTransform.ScaleX"

Duration="0:0:.5"

From="1" To="2"

FillBehavior="Stop"

AutoReverse="True"/>

 

<DoubleAnimation

Storyboard.TargetProperty="LayoutTransform.ScaleY"

Duration="0:0:.5"

From="1" To="2"

FillBehavior="Stop"

AutoReverse="True"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

 

<EventTrigger RoutedEvent="Button.Click">

<BeginStoryboard>

<Storyboard>

<ColorAnimation

Storyboard.TargetProperty="Background.Color"

Duration="0:0:1"

From="White" To="Orange"

FillBehavior="Stop"

AutoReverse="True"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

</Style.Triggers>

</Style>

</Window.Resources>

 

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">

<Button>0</Button>

<Button>1</Button>

<Button>2</Button>

<Button>3</Button>

<Button>4</Button>

<Button>5</Button>

<Button>6</Button>

<Button>7</Button>

<Button>8</Button>

<Button>9</Button>

</StackPanel>



 


by 피요히코~ 2009. 2. 25. 13:10

<Window.Resources>

<LinearGradientBrush x:Key="gBrush" StartPoint="0,0" EndPoint="0,1">

<GradientStop Offset="0" Color="Gray"/>

<GradientStop Offset="0.3" Color="#FF222222"/>

<GradientStop Offset="0.3" Color="Black"/>

<GradientStop Offset="0.9" Color="Black"/>

<GradientStop Offset="0.9" Color="#FF222222"/>

<GradientStop Offset="1" Color="Gray"/>

</LinearGradientBrush>

 

<ScaleTransform x:Key="sTransform" ScaleX="3" ScaleY="{Binding RelativeSource={RelativeSource Self}, Path=ScaleX}"/><!--ScaleX ScaleY 바인딩-->

</Window.Resources>

 

<Grid ShowGridLines="True"><!--32-->

<Grid.RowDefinitions>

<RowDefinition Height="50"/>

<RowDefinition Height="*"/>

<RowDefinition Height="55"/>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="70"/>

<ColumnDefinition Width="*"/>

</Grid.ColumnDefinitions>

 

<!--실제내용-->

<Rectangle Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Fill="{StaticResource gBrush}"/>

<Rectangle Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Fill="{StaticResource gBrush}"/>

 

<Grid Grid.Row="1" Grid.Column="0" Background="White">

<Slider Margin="20" Orientation="Vertical" Minimum="1" Maximum="10" Height="100"

  Name="slider" Value="{Binding Path=ScaleX, Source={StaticResource sTransform}, Mode=TwoWay}"/>

<!--역방향바인딩 : 영향을 주는 Slider쪽에서 Binding구현 -->

<!--양방향바인딩( two way : 서로가 서로에 영향을 ) -->

</Grid>

 

<!--ScrollViewer.HorizontalScrollBarVisibility="Disabled" : 가로로 overflow생겨도

    스크롤바 안생기게-->

<ListBox x:Name="pictureBox" Background="AliceBlue" Grid.Row="1" Grid.Column="1"

  ScrollViewer.HorizontalScrollBarVisibility="Disabled">

<ListBox.ItemsPanel>

<ItemsPanelTemplate>

<WrapPanel /><!--자동개행-->

</ItemsPanelTemplate>

</ListBox.ItemsPanel>

<!--이미지 추가-->

<Image Source="D:\[06]WPF\Day03\Day03\bin\Debug\image\Autumn Leaves.jpg"

  Margin="3,8" Height="35" LayoutTransform="{StaticResource sTransform}"/>

<!--나머지이미지 생략-->

</ListBox></Grid>



초기화면 : 양방향바인딩되서 Slider의 초기위치가 ScaleX값만큼 올라가있다.


by 피요히코~ 2009. 2. 25. 13:07
<Grid>

<!--다수의 속성을 같은 값으로 변화시키고 싶을때-->

<!--Height값을 Width값과 Binding시키고 Width DoubleAnimation-->

<Ellipse HorizontalAlignment="Center" VerticalAlignment="Center" Width="48"

Height="{Binding RelativeSource={RelativeSource self}, Path=Width}" Fill="Pink">

<Ellipse.Triggers>

<EventTrigger RoutedEvent="Ellipse.MouseDown">

<BeginStoryboard>

<Storyboard>

<DoubleAnimation

Storyboard.TargetProperty="Width"

From="48" To="300"

Duration="0:0:.5"

RepeatBehavior="3x"

FillBehavior="Stop"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

</Ellipse.Triggers>

</Ellipse>

</Grid>


by 피요히코~ 2009. 2. 25. 13:06

<TextBlock Text="XAML" FontSize="150pt" FontFamily="Arial Black"

  HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin=".5,.5">

<TextBlock.RenderTransform> <!--프로퍼티엘리먼트(속성) -데이터를 한개만 가질 있음-->

<TransformGroup> <!--동시에 두개이상의 변형을 주려할때 사용-->

<RotateTransform x:Name="xformRotate"/> <!--Transform객체에도 이름지정 가능-->

<ScaleTransform x:Name="xformScale"/>

</TransformGroup>

</TextBlock.RenderTransform>

 

<TextBlock.Triggers>

<EventTrigger RoutedEvent="TextBlock.MouseDown">

<BeginStoryboard>

<Storyboard>

<DoubleAnimation

Storyboard.TargetName="xformRotate"

Storyboard.TargetProperty="Angle"

From="0" To="360"

Duration="0:0:5"

RepeatBehavior="Forever"/>

 

<DoubleAnimation

Storyboard.TargetName="xformScale"

Storyboard.TargetProperty="ScaleX"

From="-1" To="1"

Duration="0:0:3"

RepeatBehavior="Forever"

AutoReverse="True"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

</TextBlock.Triggers>

</TextBlock>




by 피요히코~ 2009. 2. 25. 13:06