Transcript
Page 1: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

C#, WPF, ADO.NET

XAML, Oracle ODP.NET, Linq 심플 예제

탑크리에듀 (www.topcredu.co.kr), 이종철

Page 2: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

개요 및 Oracle Develpoer Tools 설치• C#, WPF, ADO.NET, ODP.NET, 간단한 데이터 바인딩 , OracleDataAdapter, Linq 쿼리식을 이용하여 오라클 DB 의 EMP 테이블의 내용을 ListView 에 출력하는 예제 .• Visual Studio 2015 에서 ODP.NET 을 사용하기 위해서는 Oracle Developer Tool

for Visual Studio 2015 를 다운받아 설치하면 된다 . ( http://www.oracle.com/technetwork/topics/dotnet/downloads/odacmsidownload-2745497.html )

• 오라클홈 디렉토리 아래 NETWORK\Admin 폴더에 tnsnames.ora 파일에 다음 접속하고자 하는 Oracle Server 의 접속정보 추가ONJ = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = onj) DB 명 )• )

Page 3: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

프로젝트 생성 및 참조추가• WPF 응용프로그램 형태의 프로젝트를 생성 ( 프로젝트명 : WpfOra-

cleTest)• 참조 추가 : 프로젝트 생성 후 솔루션 탐색기 -> 참조 -> 참조추가 선택 후 “어셈블리” -> “ 확장”에서 Oracle.ManagedDataAccess 선택 후 확인• 테스트 PC 가 64Bit 윈도우 10 이므로 프로젝트에서 마우스 오른쪽 속성 선택 후 빌드 -> 플랫폼 대상 (Target Platform) 을 x64 로 선택한다 .

(32Bit 인 경우 생략 )

Page 4: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

참조추가 화면

Page 5: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml(1)<Window x:Class="WpfOracleTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfOracleTest" mc:Ignorable="d" Title="MainWindow" Height="350" Width="461.659"> <Grid Margin="0,0,3.2,-0.2"> <Button x:Name="button" Content="DB Connect"

Page 6: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml(2)HorizontalAlignment="Left" Margin="20,28,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.391,-0.29" Click="DB_Connect"/> <ListView Margin="10,66,10,10" Name="lstView"> <ListView.ItemTemplate> <DataTemplate> <WrapPanel> <TextBlock Text="Empno: " /><TextBlock Text="{Binding Empno}" FontWeight="Bold" /> <TextBlock Text=", " /> <TextBlock Text=" (" /> <TextBlock Text="Ename: " /> <TextBlock Text="{Binding Ename}" TextDecorations="Underline" FontWeight="Bold" /> <TextBlock Text=")" /> <TextBlock Text="{Binding Job}" Foreground="Blue" Cursor="Hand" />

Page 7: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml(3)</WrapPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button x:Name="button1" Content="Get Data" HorizontalAlignment="Left" Margin="114,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp"/> <Button x:Name="button2" Content="Get Data from Adapter" HorizontalAlignment="Left" Margin="205,28,0,0" VerticalAlignment="Top" Width="133" Click="Select_Emp2"/> <Button x:Name="button3" Content="From Linq" HorizontalAlignment="Left" Margin="357,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp3"/> </Grid></Window>

Page 8: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(1)using System;using System.Collections.Generic;using System.Windows;using System.Windows.Controls;using System.Data;using Oracle.ManagedDataAccess.Client;using System.Collections;using System.Linq; namespace WpfOracleTest { public partial class MainWindow : Window {

Page 9: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(2) public MainWindow() { InitializeComponent(); }  OracleConnection conn;  private void DB_Connect(object sender, RoutedEventArgs e) { try { string strCon = "data source=onj;User ID=scott;Password=tiger"; conn = new OracleConnection(strCon); conn.Open();  MessageBox.Show("DB Connection OK!");  }

Page 10: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(3) catch(Exception error) { MessageBox.Show(error.ToString()); } }  /* Connection, Command, DataReader 를 통한 데이터 추출 */ private void Select_Emp(object sender, RoutedEventArgs e) { string sql = "select empno, ename, job from emp ";  OracleCommand comm = new OracleCommand(); if(conn == null) DB_Connect(this, null); comm.Connection = conn; comm.CommandText = sql;

Page 11: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(4)OracleDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection); List<EmpViewModel> emps = new List<EmpViewModel>(); while (reader.Read()) { emps.Add(new EmpViewModel() { Empno = reader.GetInt32(reader.GetOrdinal("empno")), Ename = reader.GetString(reader.GetOrdinal("ename")), Job = reader.GetString(reader.GetOrdinal("job")) });}  lstView.ItemsSource = emps; }

Page 12: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(5)/* OracleDataAdapter 를 통한 EMP 테이터 추출 */ private void Select_Emp2(object sender, RoutedEventArgs e) {  OracleDataAdapter adapter = new OracleDataAdapter();  string sql = "select empno, ename, job from emp ";  OracleCommand comm = new OracleCommand(); if (conn == null) DB_Connect(this, null); comm.Connection = conn; adapter.SelectCommand = comm; comm.CommandText = sql; DataSet ds = new DataSet("emps"); adapter.Fill(ds, "emp");

Page 13: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(6) // Clear the ListView control lstView.Items.Clear();  List<EmpViewModel> emps = new List<EmpViewModel>(); for (int i = 0; i < ds.Tables["emp"].Rows.Count; i++) { DataRow dr = ds.Tables["emp"].Rows[i]; emps.Add(new EmpViewModel() { Empno = System.Convert.ToInt32(dr["empno"]), Ename = dr["ename"].ToString(), Job = dr["job"].ToString() }); }  lstView.ItemsSource = emps; conn.Close(); }

Page 14: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(7) /* Linq 쿼리식을 통한 EMP 테이터 추출 */ private void Select_Emp3(object sender, RoutedEventArgs e) { OracleDataAdapter adapter = new OracleDataAdapter();  string sql = "select empno, ename, job from emp ";  OracleCommand comm = new OracleCommand(); if (conn == null) DB_Connect(this, null); comm.Connection = conn; adapter.SelectCommand = comm; comm.CommandText = sql; DataSet ds = new DataSet("emps"); adapter.Fill(ds, "emp"); // Clear the ListView control lstView.Items.Clear();

Page 15: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

MainWindow.xaml.cs(8)List<EmpViewModel> emps = new List<EmpViewModel>(); IEnumerable query = from myemp1 in ds.Tables["emp"].AsEnumerable() where myemp1["job"].Equals("CLERK") select myemp1;  foreach (DataRow dr in query) { emps.Add(new EmpViewModel() { Empno = System.Convert.ToInt32(dr["empno"]), Ename = dr["ename"].ToString(), Job = dr["job"].ToString() }); }  lstView.ItemsSource = emps; conn.Close(); } }}

Page 16: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

EmpViewModel.cs(1)using System;using System.ComponentModel;using System.Windows.Input; namespace WpfOracleTest{ public class EmpViewModel : INotifyPropertyChanged { int empno = 0; string ename = string.Empty; string job = string.Empty;

// 속성이 바뀔때 이벤트 발생하도록 이벤트 정의 public event PropertyChangedEventHandler PropertyChanged;  // public 프로퍼티 public int Empno { get { return empno; } set { this.empno = value; } }  // public 프로퍼티 public string Ename { get { return ename; } set { this.ename = value; } }

Page 17: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

EmpViewModel.cs(2) // public 프로퍼티 public string Job { get { return job; } set { this.job = value; } }  protected void OnPropertyChanged(string propertyName) { // 이벤트를 발생시킨다 . if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }}

Page 18: 닷넷, WPF, XAML, 오라클, 링크, 어댑터이용 AOD.NET 간단 예제(C#, Wpf,odp.net,ado.net,linq simple example)_WPF교육/WPF학원

실행 화면


Recommended