블로그 이미지
생각처럼

카테고리

전체보기 (209)
TOOL (1)
다이어리 (1)
Bit (200)
HELP? (0)
Total
Today
Yesterday

달력

« » 2025.2
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

공지사항

태그목록

최근에 올라온 글

DragDrop 이벤트 설정시 좌표 인식이 잘못되는 현상이 발생할수있다

 

이는 현제 폼이 아닌 전체 스크린에 좌표를 가지고 오는중 생기는 문제점으로

 

해결방법이 여러가지가 있지만 간단한 해결방법은

 

PointToClient 함수사용

 

Dim pt As Point = Me.PointToClient(New Point(e.X, e.Y)) '현재 폼기준의 좌표를 가지고 온다.

 

하지만 이경우에도 문제점이 발생할수 있다

 

Dim targetIndex = lstPage1.GetItemAt(pt.X, pt.Y) '좌표를 기준으로 이동할 위치 데이터 가지고온다

이함수를 사용하여 좌표를 가지고 리스트뷰의 아이템을 가지고 오려는데

 

인식이 안된다

 

이유는

 

빨간 색으로 표시된 부분의 좌표를 제대로 인식못한다

 

DragDrop 함수내에서

PointToClient 함수를 사용하여 좌표를 구하면 이폼 전체를 인식한다

하지만

DragDrop 함수내에서

Dim targetIndex = lstPage1.GetItemAt(pt.X, pt.Y) 이함수를 사용하여 좌표를 적용시킬때는

 

리스트 뷰의 내부에서 의 좌표만 정상적으로 인식을 한다.

 

하여 빨간색으로 표시된 부분이 차지하는값을 날려버려야한다

pt.X = pt.X - ToolStrip1.Size.Width  이런식으로 좌표값을 빼준다

Posted by 생각처럼
, |

비동기

Bit / 2012. 2. 3. 17:40

무명(anonymous) 메소드를 통해서 좀더 간편하게 비동기 프로그램을 작성할 수 있지만,
하지만 아직도 IEnumerator 멤버 변수를 계속 선언해야 하고, 거의 비슷한 무명 메소드들을 반복해서 작성해야 하는 번거로움은 남아 있었다.
이것도 줄일 수 없는지 고민해 봤다.


다음 코드를 만들어 봤다.

    public class IteratorRunner
    {
        private static LocalDataStoreSlot ITERATOR_DATA = Thread.AllocateDataSlot();

 

        public static void StartIterator( IEnumerator iterator )
        {
            IteratorData data = new IteratorData( iterator, SynchronizationContext.Current );

 

            Thread.SetData( ITERATOR_DATA, data );
            iterator.MoveNext();
        }

 

        public static AsyncCallback ResumeIterator()
        {
            IteratorData data = (IteratorData)Thread.GetData( ITERATOR_DATA );

 

            return new AsyncCallback(
                delegate( IAsyncResult state )
                {
                    data.context.Post(
                        delegate( object s )
                        {
                            Thread.SetData( ITERATOR_DATA, data );
                            data.enumerator.MoveNext();
                        },
                        null );
                } );
        }

       

        //단순히 두가지 정보를 담기 위한 클래스
        private class IteratorData
        {
            public IEnumerator enumerator;
            public SynchronizationContext context;


            public IteratorData( IEnumerator enumerator, SynchronizationContext context )
            {
                this.enumerator= enumerator;
                this.context = context;
            }
        }

    }

위의 IteratorRunner를 이용하여 비동기 프로그램을 작성해 보면 다음과 같이 훨씬 간단해 진다.

class Form1 : Form
{

    ...


    private void button1_Click( object sender, EventArgs e )
    {           

            IteratorRunner.StartIterator( GetData() );
    }

 

    private IEnumerator<int> GetData()

    {

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://www.naver.com" );
        request.Method = "GET";

        

        IAsyncResult ar = request.BeginGetResponseIteratorRunner.ResumeIterator(), null );
        yield return 1;

        

        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse( ar );

 

        MemoryStream recvData = new MemoryStream();
        using( Stream inStream = response.GetResponseStream() )
        {
                byte[] buffer = new byte[1024];
                int read = 0;
                do
                {
                    IAsyncResult ar2 = inStream.BeginRead( buffer, 0, buffer.Length,
                                                                              IteratorRunner.ResumeIterator(), null );
                    yield return 1;

 

                    if( ( read = inStream.EndRead( ar2 ) ) <= 0 )
                        break;

 

                    recvData.Write( buffer, 0, read );
                }
                while( read > 0 );
        }

        response.Close();
        

        String recvStr = Encoding.UTF8.GetString( recvData.ToArray() );
        this.textBox1.Text = recvStr;

    }

 

    ...
}

일단 눈에 뛰는 점은 반복적으로 작성해야 했던 무명 메소드를 작성하지 않았다. 콜백 delegate를 넣어야 하는 부분이 모두 IteratorRunner.ResumeIterator 메소드 호출로 대체되었다. 또한 비동기 작업마다 IEnumerator 멤버를 생성해 주어야 했던 것도 없어졌다.

이쯤되면 쓸만해 진것 같다. 이제 비동기 작업이 필요하면 비동기 작업을 수행하는 메소드(위에서는 GetData) 만 작성하면 된다. 다른 부속물없이 말이다.

 

그럼 위의 코드가 왜 작동하게 되는지 설명해 보자.

이를 위해서는 반복기(Iterator)와 관련하여 그 실행흐름을 좀 살펴볼 필요가 있다.

 

 

위의 그림에서 보면 비동기 작업이 완료되어 무명 메소드 부분이 실행되면 enumerator.MoveNext()를 호출하게 되는데,

이때 이 MoveNext()가 반환할 때까지 실행되는 경로가 파란색으로 표시되어 있다.

 

이 파란색 선은 하나의 Thread가 실행되는 경로다. 따라서 위의 그림은 이전 ResumeIterator 내부의 무명 메소드에서 부터 다음 ResumeIterator 까지, 하나의 Thread가 연속해서 실행한다는 이야기다. 이것은 이전 ResumeIterator 메소드 호출에서의 정보를, 다음 ResumeIterator 호출때 까지 전달할 수 있는 힌트가 된다.

 

이 파란색 선으로 표시된 실행흐름이 하나의 Thread에 의해서만 이루어 지기 때문에 Thread Local 변수를 이용하면 정보를 전달할 수 있다. 하나의 Thread가 파란색 선으로 표시된 실행경로를, ThreadLocal을 이용해 자신만의 데이터를 가지고, 방해없이 한번에 실행시키게 되기 때문에, 여러 Thread에 의해서 IteratorRunner.ResumeIterator()가 호출된다고 하더라도 서로간에 간섭없이 작동하게 된다.

이렇게 되면 초기의 enumerator의 값을 비동기 작업이 진행되는 내내 전달할 수 있기 때문에, IEnumerator 를 멤버 변수로 선언해야 했던 부분도 제거할 수 있게 된다.

또한 이런 구조 덕분에 반복해서 작성해야 했던 무명 메소드도 IteratorRunner.ResumeIterator()를 호출 하는 것으로 대체할 수 있다.

 

이제 진짜로 좀 쓸만해 진거 같다. 

Posted by 생각처럼
, |

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

using System.Drawing.Drawing2D;
using System.Drawing.Imaging;


namespace ff
{
 /// <summary>
 /// Form1에 대한 요약 설명입니다.
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Timer timer1;
  private System.Windows.Forms.Button button1;
  private System.ComponentModel.IContainer components;

  public Form1()
  {
   //
   // Windows Form 디자이너 지원에 필요합니다.
   //
   InitializeComponent();

   //
   // TODO: InitializeComponent를 호출한 다음 생성자 코드를 추가합니다.
   //
  }

  /// <summary>
  /// 사용 중인 모든 리소스를 정리합니다.
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null) 
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows Form 디자이너에서 생성한 코드
  /// <summary>
  /// 디자이너 지원에 필요한 메서드입니다.
  /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
  /// </summary>
  private void InitializeComponent()
  {
   this.components = new System.ComponentModel.Container();
   this.timer1 = new System.Windows.Forms.Timer(this.components);
   this.button1 = new System.Windows.Forms.Button();
   this.SuspendLayout();
   // 
   // timer1
   // 
   this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
   // 
   // button1
   // 
   this.button1.Location = new System.Drawing.Point(256, 0);
   this.button1.Name = "button1";
   this.button1.TabIndex = 0;
   this.button1.Text = "button1";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   // 
   // Form1
   // 
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(344, 277);
   this.Controls.Add(this.button1);
   this.Name = "Form1";
   this.Text = "Form1";
   this.Load += new System.EventHandler(this.Form1_Load);
   this.Closed += new System.EventHandler(this.Form1_Closed);
   this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   this.ResumeLayout(false);

  }
  #endregion

  /// <summary>
  /// 해당 응용 프로그램의 주 진입점입니다.
  /// </summary>
  [STAThread]
  static void Main() 
  {
   Application.Run(new Form1());
  }

  Image b1;
  Image b2;

  private void Form1_Load(object sender, System.EventArgs e)
  {
            b1 = new Bitmap("C:\\Documents and Settings\\won\\My Documents\\My Pictures\\10003307571.gif");
   b2 = new Bitmap(b1.Width*100, b1.Height);
   Graphics g = Graphics.FromImage(b2);
   g.FillRectangle(new SolidBrush(BackColor), 0,0, b2.Width,b2.Height);

   float[][] matrix = {
           new float[]{1,0,0,0,0},
           new float[]{0,1,0,0,0},
           new float[]{0,0,1,0,0},
           new float[]{0,0,0,0f,0},
           new float[]{0,0,0,0,1}
          };
   for(int i=0; i<99; i++)
   {
    ColorMatrix colMatrix = new ColorMatrix(matrix);
    ImageAttributes imgAtt = new ImageAttributes();
    imgAtt.SetColorMatrices(colMatrix, colMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    
    g.DrawImage(b1, new Rectangle(i*b1.Width, 0, b1.Width, b1.Height), 0, 0, b1.Width, b1.Height,
     GraphicsUnit.Pixel, imgAtt);
    matrix[3][3]+=0.01f;
   }
   g.Dispose();
   timer1.Interval = 300;   
  }

  int p=0;
  private void timer1_Tick(object sender, System.EventArgs e)
  {
   Graphics g = this.CreateGraphics();
   g.DrawImage(b2, new Rectangle(0,0,b1.Width,b1.Height), p*b1.Width, 0, b1.Width, b1.Height, GraphicsUnit.Pixel);
   g.Dispose();
   p++;
  }

  bool timerState = false;
  private void button1_Click(object sender, System.EventArgs e)
  {
   if(timerState) 
   {
    timerState = false;
    timer1.Stop();
   }
   else
   {
    timerState = true;
    timer1.Start();
   }

  }


  private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
   e.Graphics.DrawImage(b2, new Rectangle(0,0,b1.Width,b1.Height), p*b1.Width, 0, b1.Width, b1.Height, GraphicsUnit.Pixel);
  }

  private void Form1_Closed(object sender, System.EventArgs e)
  {
   b1.Dispose();
   b2.Dispose();
  }

 }
}


Posted by 생각처럼
, |

출처 까맣게 하얀 밤 | 뒤에서
원문 http://blog.naver.com/espreson/120061140525
Oracle Developer Tools
for Visual Studio .NET

Oracle Developer Tools for Visual Studio .NET(ODT)은 Microsoft Visual Studio와 긴밀하게 통합된 "애드-인" 프로그램입니다. ODT는 무료로 제공되며 Visual Studio 2005 및 Visual Studio .NET 2003에서 모두 사용이 가능합니다.

  • Visual Studio와의 통합: : Server Explorer를 사용하여 오라클 스키마를 조회하거나, Oracle Designer 및 마법사를 실행하여 스키마 오브젝트를 생성, 변경할 수 있습니다. 또 Microsoft Query Designer를 통해 쿼리를 비주얼한 방법으로 작성할 수 있습니다.
  • 자동 .NET 코드 생성: Visual Studio 2005 Datasources Window, Dataset Designer, TableAdapter Configuration Wizard를 이용하여 드래그-앤-드롭 방식으로 .NET 코드를 자동으로 생성할 수 있습니다.
  • 편리한 ASP.NET 웹 개발: ASP.NET 웹 개발자의 경우, ODT를 이용하여 최소한의 코딩 작업만으로 ASP.NET 웹 애플리케이션을 쉽게 개발할 수 있습니다.
  • 오라클 데이터베이스 프로젝트와 소스 컨트롤의 통합: .NET 애플리케이션에서 사용하는 오라클 스키마 오브젝트를 위한 SQL 스크립트를 생성하고, Oracle Database Project에서 관리하고, 소스 컨트롤 내에서 확인하고, Oracle SQL Editor에서 스크립트를 편집하고, SQL*Plus 실행 엔진을 통해 실행할 수 있습니다.
  • PL/SQL Editor, Debugger 지원: PL/SQL Editor/Debugger의 완벽한 통합 기능이 지원되므로, Visual Studio 디버깅 기능을 PL/SQL 코드에 대해 실행할 수 있습니다. 이제 .NET 코드와 PL/SQL 스토어드 프로시저를 자유롭게 넘나들며 개발 작업을 수행할 수 있습니다!
  • 사용자 정의 타입: Server Explorer를 이용하여 오라클에서 UDT를 생성, 조회할 수 있습니다. 강력한 UDT Custom Class 코드 생성 마법사를 이용하여 .NET 코드에서 UDT를 쉽고 빠르게 활용하는 것이 가능합니다. 심지어 UDT를 이용하는 애플리케이션을 (단 한 줄의 코딩 작업 없이) 신속하게 생성할 수도 있습니다.
  • NET 스토어드 프로시저의 적용: .NET Deployment Wizard를 이용하여 .NET 스토어드 프로시저 및 함수를 오라클 데이터베이스에 쉽게 적용할 수 있습니다.
  • 데이터 편집, 스토어드 프로시저 테스트, SQL 임의 실행: .NET 애플리케이션을 테스트하면서 Oracle Data Window를 이용하여 오라클 데이터를 추가, 업데이트할 수 있습니다. 또 스토어드 프로시저의 테스트를 위한 테스트베드와 SQL 구문의 임의 실행을 위한 Oracle Query Window가 지원됩니다.
  • 통합 온라인 도움말 시스템: Oracle SQL, PL/SQL 사용자 가이드를 포함하는 통합 컨텍스트 기반 온라인 도움말을 이용하여 오라클 제품 문서를 손쉽게 조회할 수 있습니다.

 ODT 11.1.0.6.20 다운로드 New production release!

 백서: Oracle Developer Tools의 새로운 기능 (PDF)

 Oracle by Example: ODT를 이용한 ASP.NET 웹 애플리케이션 개발

 Oracle by Example: ODT를 이용한 .NET 애플리케이션 구현

 Oracle by Example: Visual Studio에서 Oracle PL/SQL 디버그하기

 

 

from : http://www.oracle.com/technology/global/kr/tech/dotnet/tools/index.html?_template=/ocom/print

Posted by 생각처럼
, |

출처 카페 > .NET 리스트 | 소년하루
원문 http://cafe.naver.com/dotnetlist/573
Oracle Developer Tools For Visual Studio .NET을 이용한 .NET 애플리케이션의 개발

이 모듈은 Oracle Developer Tools for Visual Studio .NET을 이용하여 .NET 애플리케이션을 개발하는 방법을 설명하고 있습니다.

30분

이 모듈에서 다루어지는 주제가 다음과 같습니다:

 마우스를 이 아이콘 위에 가져가면 튜토리얼의 전체 스크린샷을 로드할 수 있습니다. 
(주의: 모든 스크린샷이 동시에 로드되므로, 인터넷 연결에 따라 응답시간이 느려질 수 있습니다.)

참고: 아래 단계별 아이콘 위에 커서를 가져가면, 각 단계에 해당되는 스크린샷을 선택적으로 로드할 수 있습니다.

Oracle Developer Tools for Visual Studio .NET은 Visual Studio .NET과 긴밀하게 통합된 “Add-in” 모듈로, .NET 개발자들이 오라클 데이터베이스 환경에서 개발 작업을 수행할 수 있게 합니다. Oracle Developer Tools for Visual Studio .NET은 데이터베이스 개발자에게 직관적인 개발 환경을 제공함으로써 개발자 생산성을 향상시킵니다. 또 오라클 환경을 처음 접하는 개발자를 위한 학습 용도로 활용되기도 합니다.

개발자는 Oracle Developer Tools for Visual Studio .NET이 제공하는 Oracle Explorer를 이용하여 오라클 스키마를 조회하고, 강력한 Designer/Wizard 툴을 이용해 스키마 오브젝트를 생성/변경하고, 스키마 오브젝트에 대한 드래그-앤-드롭 작업을 통해 코드를 자동으로 생성할 수 있습니다.

또 PL/SQL Editor, Ad-hoc SQL Query Window, (Oracle SQL 및 PL/SQL 사용자 가이드를 포함하는) 통합 온라인 도움말 등이 제공됩니다. Oracle Explorer를 이용하면, Visual Studio 환경에서 벗어나지 않고도 오라클 데이터의 입력/수정, 저장 프로시저의 테스트와 같은 작업을 수행할 수 있습니다!

그 밖에도 다양한 기능을 활용하여 개발자 생산성을 향상시키고, Windows 기반 오라클 환경에서의 개발 방법을 쉽고 빠르게 배워 나갈 수 있습니다.

다음과 같은 순서로 준비 작업을 수행합니다:

1.

데이터베이스(8.1.7.4.1 또는 이후 버전)에 연결이 가능한지 확인합니다.

2.

Oracle Database 10g Oracle Home에 Oracle Developer Tools ( http://otn.oracle.com/dotnet )를 설치합니다. Oracle8 또는 Oracle9의 Oracle Home에 설치해서는 안됩니다. 설치 과정에서 디폴트로 새로운 Oracle Home이 생성됩니다. 이전에 Oracle8 또는 Oracle9의 Oracle Home을 사용해온 경우, (Oracle_home/network/admin 디렉토리에 위치한) tnsnames.ora 파일을 새로 생성된 Oracle Home에 복사해야, 기존의 connection alias를 그대로 사용할 수 있습니다.

다운로드 : http://www.oracle.com/technology/software/tech/dotnet/odt_index.html

 

애플리케이션을 생성하기 전에, 먼저 Visual Studio를 실행하고 인터페이스를 점검해 보기로 합니다. 아래와 같이 작업을 수행합니다:

1.

Start > Programs > Microsoft Visual Studio .NET > Microsoft Visual Studio .NET을 선택합니다.

 

2.

View > Oracle Explorer를 선택합니다.

 

3.

연결을 추가하기 위해 + 아이콘을 클릭합니다.

 

4.

Data source name을 입력합니다 User name과 Password에 “hr”을 입력하고, Save password를 클릭한 뒤Test Connection을 클릭합니다.

 

5.

연결 테스트가 성공적임을 확인하고 OK를 클릭합니다.

 

6.

OK를 클릭합니다.

 

7.

새로운 연결이 생성되었습니다. hr.<database>를 확장합니다. 다음 단계에서는 새로운 테이블을 생성합니다.

 

EMPLOYEES테이블을 참조하는 외래 키(foreign key)를 갖는 DEPENDENTS 테이블을 생성합니다.

컬럼의 생성
인덱스의 생성
외래 키의 생성

컬럼의 생성

아래와 같이 작업하여 테이블의 컬럼을 생성합니다:

1.

Tables를 마우스 오른쪽 버튼으로 클릭한 후 New Relational Table...을 선택합니다.

 

2.

Table Name으로 DEPENDENTS를 입력하고 Columns 탭에서 Add를 클릭합니다.

 

3.

Name에 FIRSTNAME을 입력하고 데이터타입으로 VARCHAR2를, Size에 30을 입력한 다음, Add를 클릭합니다.

 

4.

Name에 LASTNAME을 입력하고 데이터타입으로 VARCHAR2를, Size에 30을 입력한 다음, Add를 클릭합니다.

 

5.

Name에 BIRTHDATE을 입력하고 데이터타입으로 DATE를 선택한 다음, Add를 클릭합니다.

 

6.

Name에 RELATIONSHIP을 입력하고 데이터타입으로 VARCHAR2를, Size에 20을 입력한 다음, Add를 클릭합니다.

 

7.

Name에 EMPLOYEEID를 입력하고 데이터타입으로 NUMBER를, Size에 6을, Precision에 0을 입력한 다음,Add를 클릭합니다.

 

8.

Name에 DEPENDENTID를 입력하고 데이터타입으로 NUMBER를, Size에 4를, Precision에 0을 입력한 다음,Save를 클릭합니다 이제 인덱스를 생성할 준비가 완료되었습니다.

 

주제로 돌아가기

인덱스의 생성

테이블의 인덱스를 생성하기 위해 아래와 같은 순서로 작업합니다:

1.

Indexes 탭을 클릭합니다.

 

2.

Add를 클릭합니다.

 

3.

Name으로 DEPENDENTS_INDX를 입력하고 Index Keys 영역에서 Add를 클릭합니다.

 

4.

Key로 DEPENDENTID를 선택하고 Save를 클릭합니다. 이제 인덱스가 생성되었습니다.

 

주제로 돌아가기

외래 키(Foreign Key)의 생성

테이블에 외래 키를 생성하기 위해, 아래와 같은 순서로 작업합니다:

1.

Constraints 탭을 클릭합니다.

 

2.

Add를 클릭합니다.

 

3.

Name에 EMPLOYEES_FK를 입력하고, Type에서 Foreign Key를, Table에서 EMPLOYEES를, Constraint에서 EMP_EMP_ID_PK를 선택합니다. Referenced Column에서 EMPLOYEE_ID를, Local Column에서EMPLOYEEID를 선택한 후 Save를 클릭합니다.

 

4.

Oracle Explorer 뷰를 통해 생성된 테이블, 인덱스 및 제약조건을 확인할 수 있습니다.

 

주제로 돌아가기

테이블의 데이터에 접근하기 위해 아래와 같은 순서로 작업합니다.

1.

DEPENDENTS 테이블을 마우스 오른쪽 버튼으로 클릭한 후 Retrieve Data...를 선택합니다.

 

2.

최소 4개의 데이터를 입력합니다 (이때 유효한 Employee ID가 입력되어야 함에 주의합니다). Save를 클릭합니다.

 

주제 목록으로 돌아가기

프로젝트를 생성하고, DEPENDENTS 테이블의 데이터를 출력하는 코드를 생성해 보기로 합니다. 아래와 같은 순서로 작업합니다:

1.

Start 탭에서, New Project...를 선택합니다.

 

2.

Project Type으로 Visual C# Projects를, Template으로 Windows Application을 선택하고 Name(obe1)과 Location을 입력한 후 OK를 클릭합니다.

 

3.

Oracle Explorer 윈도우에서 DEPENDENTS 테이블을 선택하고 오른쪽 창의 Form1에 마우스로 끌어다 놓습니다.

 

4.

Yes를 클릭하여 생성되는 코드 내에 연결 패스워드를 저장하도록 합니다.

 

5.

Form 아래에 나타난 아이콘은 자동으로 생성된 코드를 의미합니다. 이 경우, Oracle Data Provider for .NET에 포함된 OracleDataAdapter가 생성되었음을 확인할 수 있습니다. dependentsOracleDataAdapter1을 더블클릭하여 코드를 확인합니다.

 

6.

생성된 코드를 포함하는 Form이 표시됩니다. Windows Form Designer generated code를 확장합니다.

 

7.

OracleDataAdapter는 ADO DataAdapter를 기반으로 하고 있습니다. ADO DataAdapter는 데이터베이스와 폼 위짓(widget)이 최소한의 코드만으로도 데이터를 주고받을 수 있도록 설계되어 있습니다. OracleDataAdapter 클래스는 Oracle Data Provider for .NET을 통해 제공됩니다. Oracle Data Provider for .NET는 Oracle Developer Tools 설치 과정에서 함께 설치됩니다. Form1.cs (Design) 탭을 클릭합니다.

 

8.

Dependents 테이블의 데이터를 애플리케이션에 디스플레이하기 위해, 폼에 Toolbox의 DataGrid를 추가합니다.View->Toolbox 메뉴를 선택합니다.

 

9.

Windows Forms 목록에서 DataGrid 를 선택하고, Form1 위에 마우스로 끌어다 놓습니다.

 

10.

DataGrid를 더블클릭하여 폼 안에 생성된 코드를 확인합니다.

 

11.

Select DataGrid1 from the list of Members.

 

12.

Members 목록에서 DataGrid1을 선택합니다.

DataSet ds= new DataSet(); dependentsOracleDataAdapter1.Fill(ds); dataGrid1.DataSource = ds.Tables[0];

참고: Visual Basic Project를 생성하는 경우 InitializeComponent() 뒷부분에 삽입되는 Public Sub New()메소드를 위한 코드가 다음과 같습니다:

Dim ds As DataSet = New DataSet dependentsOracleDataAdapter1.Fill(ds) DataGrid1.DataSource = ds.Tables(0) 

 

13.

Output 영역에 에러 메시지가 나타나지 않았는지 확인한 다음 Debug > Start를 선택합니다.

 

14.

애플리케이션이 실행되면서 데이터와 함께 폼이 디스플레이됩니다.

 

주제 목록으로 돌아가기

저장 프로시저를 생성하고 실행해 봅니다.

저장 프로시저의 생성
Package Body의 편집
저장 프로시저의 실행

저장 프로시저의 생성

1.

Oracle Explorer 윈도우에서, Packages를 마우스 오른쪽 버튼으로 클릭한 후 New Package를 클릭합니다.

 

2.

Package name으로 MYPACK을 입력하고 Methods 아래의 Add 버튼을 클릭합니다.

 

3.

Method name 필드에 GETCURSORS를 입력하고, Methods type 필드에서 Procedure를 선택한 후, Parameters 아래의 Add 버튼을 클릭합니다.

 

4.

Name 필드에 MAXROWS를 입력하고 Add를 클릭합니다.

 

5.

Name에 EMPLOYEESCUR를 입력하고, Direction으로 OUT을, Data type으로 SYS_REFCURSOR를 선택한 다음 Add를 클릭합니다.

 

6.

Name에 DEPENDENTSCUR를 입력하고, Direction에서 OUT을, Data type에서 SYS_REFCURSOR를 선택한 다음 OK를 클릭합니다.

 

7.

Preview SQL >>을 클릭하여 실행될 SQL 구문을 확인합니다.

 

8.

SQL 코드를 확인한 뒤 OK를 클릭합니다.

 

9.

OK를 클릭하여 Package를 생성합니다.

 

주제로 돌아가기

Package Body의 편집

1.

Oracle Explorer 윈도우에서, 방금 생성한 MYPACK Package를 마우스 오른쪽 버튼으로 클릭하고 Edit Package Body를 선택합니다.

 

2.

NULL 라인을 아래 코드로 대체한 다음, 윈도우 탭을 마우스 오른쪽 버튼으로 클릭하고 Save를 선택합니다.

OPEN EMPLOYEESCUR FOR SELECT * FROM EMPLOYEES; OPEN DEPENDENTSCUR FOR SELECT * FROM DEPENDENTS;

 

주제로 돌아가기

저장 프로시저의 실행

1.

Oracle Explorer 윈도우에서 MYPACK Package를 확장하고, GETCURSORS를 마우스 오른쪽 버튼으로 클릭한 뒤 Run을 선택합니다.

 

2.

MAXROWS 매개변수 값으로 999를 입력하고 OK를 클릭합니다.

 

3.

EMPLOYEESCUR을 선택합니다.

 

4.

Employees 커서의 상세 정보가 표시됩니다. DEPENDENTSCUR를 선택합니다.

 

5.

Dependents 커서의 상세 정보가 표시됩니다.

 

주제로 돌아가기

이 튜토리얼을 통해, 다음과 같은 내용을 학습하였습니다:

 

 

출처 : 오라클사

Posted by 생각처럼
, |
Posted by 생각처럼
, |
Posted by 생각처럼
, |

출처 SYSCLUB | 곰돌이
원문 http://blog.naver.com/koreaotn/10014754785

오라클을 디비로 사용하였을 때 클라이언트에 1CD크기의 설치 파일을 각각에게
배포하는 것은 무리일 수 있다. 물론 속편하게 오라클 클라이언트를 설치하면 해결 되지만,
때론 이런 무식한(?)방법이 좋을 때도 있다. 암튼..
이번에는 Instant Client를 이용하여 간단하게 클라이언트 환경을 구축해 보기로 하자.

대부분의 클라이언트가 윈도우즈 환경일 것이므로 윈도우즈에 맞추어서 팁을 작성.
(밑에 소개 되겠지만 Instant Client 다운로드 사이트에 거의 모든 운영체제 별로
파일이 존재 한다. 물론 설치 및 설정 방법도 거의 차이가 없으므로 무리는 없음.)


1. Instant Client 다운로드


[한글페이지]
http://www.oracle.com/technology/global/kr/tech/oci/instantclient/instantclient.html
[영문페이지] - 추천
http://www.oracle.com/technology/tech/oci/instantclient/index.html

2. 소개(한국오라클 otn문서)


Instant Client는 표준 Oracle 클라이언트를 설치하지 않은 환경에서 OCI, OCCI, ODBC, JDBC 애플리케이션을 수정 없이 실행할 수 있도록 합니다. Instant Client를 적용하는 경우 디스크 사용량을 상당 수준 절감할 수 있습니다. Instant Client를 이용하여 SQL*Plus를 실행할 수도 있습니다. 재컴파일과 같은 수고를 들일 필요도 없습니다.
ISV와 파트너의 경우, 자사의 애플리케이션과 Instant Client를 함께 패키징함으로써, 고객이 Oracle 클라이언트를 설치하는 수고를 덜게 할 수 있습니다. Oracle ISV와 파트너가 개발한 애플리케이션의 성능과 기능은 아무런 영향 없이 그대로 구현 가능합니다.
고객은 새롭게 패키징된 애플리케이션을 별도의 설치 작업 없이 그대로 사용할 수 있습니다. 대규모 엔터프라이즈 환경에서는 중앙에 위치한 서버에 설치 스크립트를 올려 놓고 Instant Client의 셋업과 구성이 자동적으로 수행되도록 할 수 있습니다. Instant Client는 매우 작은 용량만을 차지하므로 그 적용 범위가 매우 다양합니다. 
Instant Client는 운영 환경에 적용하는 경우에도 아무런 문제가 없으며, 무료로 제공됩니다.

3. 설치 및 설정 (1)


- 위의 사이트에서 윈도우 32비트(또는 64비트)를 다운 로드 한다.
- 윈도우용 다운로드 사이트에 보면 파일 크기와 지원정도가 다른 각각의 파일이 존재한다.
- 지원 정도(범위)를 읽어 보고 필요한 파일을 다운로드 한다.(basic 추천)
- 기본적으로 1M에서 40M정도의 파일들이다.

4. 설치 및 설정 (2)


- 받은 파일의 압축을 풀면 instantclient폴더와 txt파일이 있다.
- 사용자 임의의 폴더에 instantclient폴더를 옮긴 후 path설정 및 환경 설정을 한다.
- 시스템 변수 추가 (C\instantclient 로 편의상 옮겼을 때)
  TNS_ADMIN
  C\instantclient
- 시스템 path 다음을 추가
  C\instantclient
- tnsnames.ora 파일을 instantclient폴더에 추가 한다.
  예) 사용자의 서버 주소 및 환경에 따라 다를 수 있음. 서버의 network\admin 폴더 참고
  listener =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip주소)(PORT = 1521))
      )                                                                
      (CONNECT_DATA =
        (SID = orcl) 
      )
    )
    ** 위의 ip 주소와 SID=orcl(SERVICE_NAME=스키마네임) 중 orcl은 
          자신의 환경에 맞게 수정

5. 접속 테스트


Toad 등의 유틸을 사용해서 테스트 해도 되고 sqlplus를 이용하여 테스트 하여도 된다.
간단하게 sqlplus를 사용해 본다면, 위의 사이트에서 sqlplus패키지(1M미만) 다운로드.
압축을 풀고 instantclient폴더에 해당파일 전체를 옮겨준다.
명령프롬프트에서 sqlplus.exe 파일을 실행하여 접속 테스트 진행
예) sqlplus 아이디/패스워드@아이피주소:1521/orcl
    C:\sqlplus username/password@주소:port/service_name
    C:\sqlplus ID/PASS@ip주소:1521/testdb.world
    SQL>conn system/manager@ip주소:1521/testdb.world

6. 추가 사항


- ODBC연결을 추가 할려면 위의 사이트에서 odbc패키지를 다운받다 인스톨 해주면 됨.
- 닷넷/vs2005 및 oledb 연결 환경을 설치 하고자 한다면 다음 사이트에서 다운 후 인스톨.
   http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

7. 후기


php를 설치하기 위해 다운로드 후 압축을 풀어보면 해당 루트 폴더에 ntwdblib.dll 이
존재 하는데 이 파일이 SQL Server와 연결 시켜 주는 클라이언트 파일이다. 마찬가지로
오라클도 oci.dll파일이 이런 기능을 담당하는 핵심 파일이다.
php_oci8.dll <--- > oci.dll
php_mssql.dll  <---> ntwdblib.dll
php_mysql.dll <---> libmysql.dll 
또한 delphi에서도 dbexpress 연결을 사용하기 위해서도 이와 비슷한 구조를 가지고 있다.
sqlserver2005에는 2000버전과 다르게 ntwdblib.dll파일이 없다. 하지만 2000에서
2005버전으로 접속할 수 있으므로 최신 버전의 ntwdblib.dll를 활용하면 된다.
sqlserver2005버전도 오라클과 마찬가지로 instantclient형태로 간단한 클라이언트 파일을
제공하고 있다.
---------------
Oracle, SqlServer, Mysql ... 다양한 접속 환경이 마련되어 있다. 
odbc, oledb, oo4o, ado.net ..등등 mysql도 홈페이지에서 제공 하고 있다.
---------------

Posted by 생각처럼
, |

// 윈도우즈 폼 개발

// 개발 툴 : visual studio 2008

// Odac : 11g

// 오라클 인스턴트 클라이언트 : 11g (프로그램이 사용될 PC에 오라클 클라이언트를 설치없이 사용을 위해)

 

// 사용법 : 오라클 사이트에서 Odac 11g 를 받아서 설치한다.

// 11g 를 사용하는 이유는 visual studio 2008 지원이라서 ^^

// 잠깐 테스트 해보았는데, 하위 버전도 되는것 같았지만 개발툴을 지원하는것 사용함. ㅎㅎ;

// 오라클 사이트 참고

 

// 1. Odac 설치 되면 visual studio 2008 의 참조추가 에서 Oracle.DataAccess 추가 한다.

// 2. using 사용.

    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;

 

// 3. 접속 방법

    public void DBConnect()
    {
        // 연결 문자열

        // 사용하는 오라클 DB 의 접속 IP, SID 입력

         string connString = @"
                    (DESCRIPTION =
                    (ADDRESS_LIST =                                   
                      (ADDRESS = (PROTOCOL = TCP)(Host = 10.10.10.1)(Port = 1521))
                    )
                    (CONNECT_DATA = 
                      (SID = test)
                    )
                  )";

        private OracleConnection  connORACON = new OracleConnection("Data Source=" + connString +     ";User ID=abc;Password=abc123;");

        connORACON.Open();


    }

 

 

// 배포 혹은 게시 할경우 (빌드시에도 Debug 디렉토리에 다음 dll 추가)

// 오라클 클라이언트 인스턴트 dll 도 같은 경로에 위치시켜준다.

// msvcp71.dll

// msvcr71.dll

// oci.dll

// ociw32.dll

// Oracle.DataAccess.resources.dll

// orannzsbb11.dll

// oraociei11.dll  (100메가 ㅡ.ㅡ;;)

// OraOps11.dll

// OraOps11w.dll

 

// 해당 프로그램을 사용하려는 컴퓨터에 만약 오라클 클라이언트 가 설치되어 있다면

// NLS_LANG 관련 에러가 발생될수 있다.

// 필요시 아래 소스를 사용

using Microsoft.Win32;

 

private void setOraNLS_LANG()
        {
            try
            {
                RegistryKey OurKey = Registry.LocalMachine; // LocalMachine
                OurKey = OurKey.OpenSubKey("Software", true); // Software
                OurKey = OurKey.OpenSubKey("ORACLE", true); // Oracle

                if (OurKey.GetValue("NLS_LANG") != null)
                {
                    OurKey.SetValue("NLS_LANG", "KOREAN_KOREA.KO16MSWIN949");
                }

                
            }
            catch
            {
            }

        }

Posted by 생각처럼
, |
SCOTT 계정의 경우 id와 pw가 너무 많은 사람들에게 노출이 되어 
처음 설치시 LOCK되어있습니다. 
UNLOCK해주셔야 하며 
SYS 또는 SYSTEM 계정에서 
ALTER USER SCOTT IDENTIFIED BY 패스워드 ACCOUNT UNLOCK
Posted by 생각처럼
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함