2014년 7월 31일 목요일

[SGA튜닝]Library Cache의 튜닝[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

Library Cache의 튜닝 

Pins : 문장 자체가 메모리에 loading 되어 library cache object가 수행 되었던 횟수 
Reloads : execution 단계에서 Library Cache에 대한 miss가 발생한 횟수 

SQL> select to_char(trunc(sum(reloads)/sum(pins)*100,5),99.99999)||'% (less than 
 1%)' "library cashe miss ratio" 
  2  from v$librarycache; 

library cashe miss ratio 
------------------------- 
  .03060% (less than 1%) 

Rario를 늘리려면 sahred_pool_size의 값을 증가 시켜야 합니다. Shared_pool_size가 너무 적으면 SQL의 공유율이 많이 떨어져 수행속도에 악 영향을 줍니다. 그러나 다른 Application에서 사용하는 메모리도 있기 때문에 SGA의 크기가 Memory의 50%를 넘지 않도록 구성 하는 것이 좋습니다.




평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

[SGA튜닝]DataBase Buffer Cache의 튜닝[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

DataBase Buffer Cache의 튜닝 

 데이터베이스 버퍼 캐시는 데이터 처리를 위해 사용되는 부분이며 가장 최근에 사용 되어진 DB 블록을 저장하고 있는 SGA의 구성 요소 입니다. 말그대로 버퍼 캐시이므로 수향 속도와 밀접한 관계가 있습니다. 최근에 사용되어진 데이터를 메모리에 보관해 추후 질의시 이를 이용하여 디스크에서 직접 데이터를 가지고 오지 않고 메모리에서 읽어 오므로 성능의 향상을 꽤 할 수 있는 겁니다. 이 곳에는 변경되지 않은 데이터 뿐 아니라 변경된 데이터도 가지고 있습니다. 또한 DataBase Buffer Cache는 chain list, dirty list, LRU list로 구성 되어져 있습니다. 오라클의 백그라운드 프로세스인 DBWR는 FREE BUFFER의 확보를 위해 변경된 데이테베이스 블록을 디스크(데이터베이스 파일)에 기록하는 역할을 합니다. 

 DataBase Buffer Cache의 BUFFER는 LRU list와 dirty list로 구성되는데 LRU list의 버퍼들은 Free buffer, Pinned Buffer, Dirty Buffe중 하나로 존재하게 됩니다. 처음엔 버퍼가 free 상태인데 사용자가 질의를 해서 디스크에서 테이블의 내용을 읽으면 이 블록들은 LRU에서 가장 최근에 읽은 것이므로  HEADER 부분(MRU, Most recently used)에 위치하게 됩니다. 이 버퍼들이 차츰 다른 테이블의 내용들이 읽혀 짐에 따라 LRU의 tail부분인 LRU(Lease Recent Used)로 이동되게 되는 겁니다. 만약 사용자가 대량의 데이터를 질의하여 버퍼가 필요한데 빈 버퍼가 없다면 제일 사용된 빈도가 작은 블록을 찾기 위해 LRU 알고리즘에 의해 LRU list의 맨 끝인 tail 부분부터 검색하기 시작 합니다. 

 LRU list의 작 버퍼에 대해 살펴 보면 Pinned Buffer는 현재 사용자가 사용중이므로 재사용 될 수 없는 상태이며 Free Buffer는 dirty buffer등이 데이터파일(디스크)에 기록되어져서 free로 mark가 되어 사용될 수 있는 상태의 버퍼 입니다. 또는 modify 되지않아 사용가능 한 상태를 나타 냅니다. 그리고 dirty buffer는 사용자가 사용하여 내용이 변경되었지만 아직 디스크에 기록되지 않은 버퍼를 나타냅니다. 

LRUW(dirty list)는 서버 프로세스에 의해 모아진 dirty buffer들이 모여 있는 곳 입니다. 이 dirty buffer들은 오라클 프로세스들이 빈 버퍼(free buffer)를 찾기 위해 LRU의 tail 부분부터 찾아 가다가 dirty buffer를 만나면 LRUW(dirty list)에 옮겨 놓게 되는 겁니다. 이 버퍼들은 추후 DBWR에 의해 디스크에 있는 데이터파일에 기록되고 다시 free로 mark 되어 LRU list에 자게 되는 것입니다. 

이번에는 버퍼 캐시의 튜닝에 대해 알아 보겠습니다. 

 버퍼 캐시에 대한 hit ratio는 논리적인 IO와 물리적인 IO에 대한 비율을 의미하며 DataBase Buffer Cache의 성능을 측정 하기 위한 주요한 척도가 됩니다. DataBase Buffer  Cache의 hit ratio는 V$sysstat에서 DB BLOCK GETS와 CONSISTENT GETS, physical reads 값으로 구해지는데 DB BLOCK GETS와 CONSISTENT GETS는 logical read를 의미하며 메모리상의 버퍼에서 access되는 블록을 뜻합니다. Physical reads는 디스크에서 읽는 것을 나타내며 데이터파일에서 로딩되는 블록의 수를 나타냅니다. 

 Hit ratio는 90%이상을 유지하는 것이 좋으며 70% 이하기 되었을 때는 db_block_buffers 또는 유_cache_size를 증가 시키는 것이 바람직 합니다. 과거의 Oracle7,8에서는 아래처럼 hit ratio를 구했습니다. 

                            (physical reads) 
    Hit ratio = --------------------------------- 
                          (consistent reads + db_block_gets) 

SQL> conn / as sysdba 
연결되었습니다. 
SQL> select trunc((1-(phy.value/(curr.value + consis.value))) * 100,5) 
  2      from v$sysstat phy, v$sysstat curr, v$sysstat consis 
  3      where phy.name = 'physical reads' 
  4    and curr.name = 'db block gets' 
  5      and consis.name = 'consistent gets' 
  6  / 

하지만 Oracle 8i, 9i에서는 좀더 정확한 값을 구하기 위해 아래처럼 physical reads direct + physical reads direct(lob)를 포함 합니다. 

SQL> set serveroutput on 
SQL> declare 
  2    physicalreads number; 
  3    physicalreadsdirect number; 
  4    physicalreadsdirectlob number; 
  5    dbblockgets number; 
  6    consis number; 
  7    hratio number; 
  8  begin 
  9    select value into physicalreads from v$sysstat where name = 'physical r 
ads'; 
 10    select value into physicalreadsdirect from v$sysstat where name = 'phys 
cal reads direct'; 
 11    select value into physicalreadsdirectlob from v$sysstat where name = 'p 
ysical reads direct (lob)'; 
 12    select value into dbblockgets from v$sysstat where name = 'db block get 
'; 
 13    select value into consis from v$sysstat where name = 'consistent gets'; 
 14    select 100 * (1- (physicalreads - (physicalreadsdirect + physicalreadsd 
rectlob)) 
 15                      /(dbblockgets + consis - physicalreadsdirect -physical 
eadsdirectlob )) into hratio 
 16          from dual; 
 17          dbms_output.put_line('DB Buffer Cache Hit Ratio : ' || hratio); 
 18  end; 
 19  / 




평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

선택정렬(Selection Sort) 구현 [자바개발자교육/자바교육/자바강좌/자바,Spring교육잘하는곳/자바,spring교육추천/자바실무교육/JAVA/JAVA교육/JAVA스프링학원/JAVA실무교육]

Recursive implementation:
public void selectionSort (int a[ ], int n) {
   if  (n <= 1)      return;
   int maxPos = 0;  // position of the max element
   int k; 
   for ( k = 1; k < n; k++)
      if (a [ k ] > a [ maxPos ] ) maxPos = k;
   int temp = a [ maxPos ];
   a [ maxPos ] = a[ n-1 ];
   a [ n-1 ] = temp;
   selectionSort (a,  n-1);
}

Iterative implementation:
public void selectionSort (int a [ ], int n){
   while  (n > 1)   {
      int k, maxPos = 0;
      for ( k = 1; k < n; k++)
         if (a [ k ] > a [ maxPos ] ) maxPos = k;
      int temp = a [ maxPos ];
      a [ maxPos ] = a[ n-1 ];
      a [ n-1 ] = temp;
      n--;
   }
}




평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

링크드리스트를 이용한 자바 삽입정렬(Insertion sort Example) [자바개발자교육/자바교육/자바강좌/자바,Spring교육잘하는곳/자바,spring교육추천/자바실무교육/JAVA/JAVA교육/JAVA스프링학원/JAVA실무교육]

// InsertionSort.java 
class SNode {
 public String key;
 public Object obj;
 public SNode next;
 public SNode (String key) {this(key, null, null);}
 public SNode (String key, Object obj) {this(key, obj, null);}
 public SNode (String key, Object obj, SNode next) {
  this.key = key;this.obj = obj;this.next = next;
 }
 public int compareTo(SNode node) {
  if (key.compareTo(node.key)<0) return -1;
  else if (key.compareTo(node.key)==0) return 0;
  else return 1;
 }
}
class Person {
 String name;
 String tel;
 Person(String name, String tel) {
  this.name = name;
  this.tel = tel;
 }
}
public class InsertionSort {
   static SNode insertionSort(SNode head) {  
      SNode end;
      SNode q;              //삽입되는 카드 1장....(새로 위치를 찾을 데이터를 가리킴)
      SNode prev;         //삽입되는 위치의 앞, 뒤 포인터
      end = head;
      while(end.next!= null) {
 q = end.next;  //새로 비교되는 대상

 //다음것이 작은 경우...위치를 바꾸자
 if (q.compareTo(head)<0){  //새로 비교되는 대상이 head 보다 작은 경우
  //head와 다음 노드의 순서를 바꾼다...
  end.next = q.next;
  q.next = head;
  head = q;
 }
 else {
  prev = head;
  //새로 추가되는 q가 큰 동안에 수행
  //즉 삽입될 위치를 찾음....
  while(q.compareTo(prev.next) > 0) {
   prev =  prev.next;
 }

 //마지막가지 비교한 결과 자기(q)보다 큰것이 없는 경우
 //q를 마지막으로
 if (q == prev.next) end = q;      
 else {  //삽입될 위치를 찾은 경우 prev 뒤에 q를 삽입
  //q가 가운데 들어가므로 q.next를 보관
  end.next = q.next;   q.next = prev.next; prev.next = q;
 }
          } //end of if
       }//end of while
       return head;
 }
 public static void main(String[] args) {
   SNode node1 = new SNode("바길동", new Person("바길동","666-6666"), null);
   SNode node2 = new SNode("라길동", new Person("라길동","444-4444"), null);

SNode node3 = new SNode("마길동", new Person("마길동","555-5555"), null);
SNode node4 = new SNode("가길동", new Person("가길동","111-1111"), null);
SNode node5 = new SNode("나길동", new Person("나길동","222-2222"), null);
SNode node6 = new SNode("다길동", new Person("다길동","333-3333"), null);
node1.next = node2;  node2.next = node3;
node3.next = node4;  node4.next = node5;
node5.next = node6;
SNode head = insertionSort(node1);
while(head != null) {
 System.out.println(((Person)(head.obj)).name + "::" + ((Person)(head.obj)).tel);
 head = head.next;

}
}



평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

[예제]Repeater 컨트롤을 이용하여 주소데이터와 이미지 데이터를 화면에 출력하기[닷넷C#교육/ADO.NET강좌/ASP.NET교육잘하는곳/C#,ASP.NET교육추천/닷넷실무교육/.NET,C#/ADO.NET교육/닷넷학원/ASP.NET실무교육]

Repeat Control은 반복적으로 DB의 데이터 등을 화면에 출력할 수 있게해주는 컨트롤 입니다. 물론 읽기 전용 이구요... 

[작업 방법] 

AddrBook이라는 주소록 테이블의 구조는 다음과 같습니다. 

name varchar(20) 
tel    varchar(20) 
image <-- 이미지 파일의 경로룰 보관(예:"image/1.gif") 

1. ASP.NET을 위한 프로젝트(C#, 웹응용프로그램) 만듭니다. 

2. Repeater 컨트롤을 화면에 올립니다. 

3. SqlDataAdapter 컨트롤을 선택하여 sqlDataAdapter를 작업을 위한 DB용으로 하나 만듭니다. (주소록 테이블과 매핑 합니다.) sqlConnection1을 선택 후 ConnectionString 속성의 맨 뒤에 ;password=**** 라고하여 비밀번호를 입력 합니다. 

4. sqlDataAdapter Control의 속성 창 아래의 "데이터 집합 만들기"를 클릭하여 DataSet을 만듭니다...(dsAddrBook)

5. sqlDataAdapter의 DataSource 속성에 위에서 만든 "dsAddrBook"을 선택 합니다. 

6. 디자인 화면 아래의 HTML을 클릭 하여 아래처럼 Template을 만듭니다. 아래는 HTML의 전체 소스 입니다. Reapeater Control에서 디자인 화면에서는 작성이 불가능 하니 아래의 템플릿 내용을 입력 합니다. 

HeaderTemplate : 데이터를 반복하여 출력시 그 Header가 됨(<table>) 
FooterTemplate : 데이터를 반복하여 출력시 그 Footer가 됨(</table>) 
ItemTemplate : 반복적으로 표시될 데이터의 디자인 부분(<tr> ~ </tr>) 

=================================== 

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="RepeatTest.WebForm1" %> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
<HTML> 
        <HEAD> 
                <title>WebForm1</title> 
                <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> 
                <meta name="CODE_LANGUAGE" Content="C#"> 
                <meta name="vs_defaultClientScript" content="JavaScript"> 
                <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> 
        </HEAD> 
        <body MS_POSITIONING="FlowLayout"> 
                <form id="Form1" method="post" runat="server"> 
                        <FONT face="굴림"> 
                                <asp:Label id="Label1" runat="server" Width="154px" Height="41px" Font-Bold="True" Font-Size="XX-Large">주소록</asp:Label> 
                                <br> 
                                <asp:Repeater id="Repeater1" runat="server" DataSource="<%# dsAddrBook1 %>"> 
                                        <HeaderTemplate> 
                                                <table> 
                                        </HeaderTemplate> 
                                        <ItemTemplate> 
                                                <tr> 
                                                        <td> 
                                                                <asp:Image ID="image1" Runat="server" ImageUrl='<%# 
                                                              DataBinder.Eval(Container.DataItem,"image")%>'> 
                                                                </asp:Image> 
                                                                <font size="2">이름 :<%# DataBinder.Eval(Container.DataItem,"name")%><br> 
                                                                        전화번호:<%# DataBinder.Eval(Container.DataItem,"tel")%><br> 
                                                                </font> 
                                                        </td> 
                                                </tr> 
                                        </ItemTemplate> 
                                        <FooterTemplate> 
                                                </table> 
                                        </FooterTemplate> 
                                </asp:Repeater></FONT> 
                </form> 
        </body> 
</HTML> 

======================================================= 

7. Page_Load 함수를 작성 합니다.(비하인드 코드) 

아래는 비하인드 코드 전체의 내용 입니다. 

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Web; 
using System.Web.SessionState; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 

namespace RepeatTest 

        /// <summary> 
        /// WebForm1에 대한 요약 설명입니다. 
        /// </summary> 
        public class WebForm1 : System.Web.UI.Page 
        { 
                protected System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1; 
                protected System.Data.SqlClient.SqlCommand sqlSelectCommand1; 
                protected System.Data.SqlClient.SqlCommand sqlInsertCommand1; 
                protected System.Data.SqlClient.SqlConnection sqlConnection1; 
                protected RepeatTest.dsAddrBook dsAddrBook1; 
                protected System.Web.UI.WebControls.Label Label1; 
                protected System.Web.UI.WebControls.Repeater Repeater1; 
        
                private void Page_Load(object sender, System.EventArgs e) 
                { 
                        // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다. 
                        if(!Page.IsPostBack) 
                        { 
                                sqlDataAdapter1.Fill(dsAddrBook1); 
                                Repeater1.DataBind(); 

                        } 
                } 

                #region Web Form Designer generated code 
                override protected void OnInit(EventArgs e) 
                { 
                        // 
                        // CODEGEN: 이 호출은 ASP.NET Web Form 디자이너에 필요합니다. 
                        // 
                        InitializeComponent(); 
                        base.OnInit(e); 
                } 
                
                /// <summary> 
                /// 디자이너 지원에 필요한 메서드입니다. 
                /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. 
                /// </summary> 
                private void InitializeComponent() 
                {    
                        this.sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter(); 
                        this.sqlSelectCommand1 = new System.Data.SqlClient.SqlCommand(); 
                        this.sqlInsertCommand1 = new System.Data.SqlClient.SqlCommand(); 
                        this.sqlConnection1 = new System.Data.SqlClient.SqlConnection(); 
                        this.dsAddrBook1 = new RepeatTest.dsAddrBook(); 
                        ((System.ComponentModel.ISupportInitialize)(this.dsAddrBook1)).BeginInit(); 
                        // 
                        // sqlDataAdapter1 
                        // 
                        this.sqlDataAdapter1.InsertCommand = this.sqlInsertCommand1; 
                        this.sqlDataAdapter1.SelectCommand = this.sqlSelectCommand1; 
                        this.sqlDataAdapter1.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { 
                                                                                                                                                                                                                                                                                                                                                                                        new System.Data.Common.DataTableMapping("Table", "addrbook", new System.Data.Common.DataColumnMapping[] { 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                new System.Data.Common.DataColumnMapping("name", "name"), 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                new System.Data.Common.DataColumnMapping("tel", "tel"), 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                new System.Data.Common.DataColumnMapping("image", "image")})}); 
                        // 
                        // sqlSelectCommand1 
                        // 
                        this.sqlSelectCommand1.CommandText = "SELECT name, tel, image FROM addrbook"; 
                        this.sqlSelectCommand1.Connection = this.sqlConnection1; 
                        // 
                        // sqlInsertCommand1 
                        // 
                        this.sqlInsertCommand1.CommandText = "INSERT INTO addrbook(name, tel, image) VALUES (@name, @tel, @image); SELECT name," + 
                                " tel, image FROM addrbook"; 
                        this.sqlInsertCommand1.Connection = this.sqlConnection1; 
                        this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@name", System.Data.SqlDbType.VarChar, 50, "name")); 
                        this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@tel", System.Data.SqlDbType.VarChar, 50, "tel")); 
                        this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@image", System.Data.SqlDbType.VarChar, 100, "image")); 
                        // 
                        // sqlConnection1 
                        // 
                        this.sqlConnection1.ConnectionString = "data source=localhost;initial catalog=pubs;persist security info=False;user id=sa" + 
                                ";workstation id=5C-T;packet size=4096;password=pass"; 
                        // 
                        // dsAddrBook1 
                        // 
                        this.dsAddrBook1.DataSetName = "dsAddrBook"; 
                        this.dsAddrBook1.Locale = new System.Globalization.CultureInfo("ko-KR"); 
                        this.dsAddrBook1.Namespace = "http://www.tempuri.org/dsAddrBook.xsd"; 
                        this.Load += new System.EventHandler(this.Page_Load); 
                        ((System.ComponentModel.ISupportInitialize)(this.dsAddrBook1)).EndInit(); 

                } 
                #endregion 
        } 



8. 프로젝트 폴더 아래에 image 폴더를 만들고 적절히 이미지를 위치 시킵니다. 

9. 실행합니다.






평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지