Comparison Operators (P2-23)

  • IN(list)
  1. SQL> conn scott/tiger
    Connected.

  2. SQL> SELECT dname
      2  FROM dept
      3  WHERE deptno IN(10,20);
  3.  
  4. DNAME
    --------------
    ACCOUNTING
    RESEARCH

 

  • WHERE deptno IN(10,20) == WHERE deptno=10 or deptno=20
  1. SQL> SELECT dname
      2  FROM dept
      3  WHERE deptno=10 or deptno=20;
  2.  
  3. DNAME
    --------------
    ACCOUNTING
    RESEARCH

 

  • WHERE deptno IN(10,20) == WHERE deptno=10 or deptno=20 == SELECT dname FROM dept WHERE deptno=ANY(10,20)
  1. SQL> SELECT dname
      2  FROM dept
      3 WHERE deptno=ANY(10,20)
  2.  
  3. DNAME
    --------------
    ACCOUNTING
    RESEARCH

 

  •  LIKE

Wildcard '%'는 0개 이상의 문자를 대표한다.

Wildcard '_'는 1개의 문자를 대표한다.

  1. // 'A'로 시작하는 부서이름 검색
  2. SQL> SELECT dname
      2  FROM dept
      3  WHERE dname like 'A%';
  3.  
  4. DNAME
    --------------
    ACCOUNTING

 

  • IS NULL

null값은 비교연산자('=') 사용 불가

'IS NULL' 이용해야함.

  1. // 잘못된 코드
  2. SQL> SELECT ename
      2  FROM emp
      3  WHERE comm = null;
  3.  
  4. no rows selected

 

  1. // 정상코드
  2. SQL> SELECT ename
      2  FROM emp
      3  WHERE comm IS NULL;
  3.  
  4. ENAME
    ----------
    SMITH
    JONES
    BLAKE
    CLARK
    SCOTT
    KING
    ADAMS
    JAMES
    FORD
    MILLER
  5. 10 rows selected.

 

 

ORDER BY Clause (P2-30)

ORDER BY 절은 가장 마지막에 써야함

정렬순서(ASC, DESC) 생략시 ASC(오름차순)이 기본값

 

  1. SQL> SELECT dname
      2  FROM dept
      3  ORDER BY dname;
  2.  
  3. DNAME
    --------------
    ACCOUNTING
    OPERATIONS
    RESEARCH
    SALES

 

Oracle sorts nulls following all others in ascending order and preceding all others in descending order.

(null 값이 젤 나중~)

  1. SQL> SELECT ename, comm
      2  FROM emp
      3  ORDER BY comm;
  2.  
  3. ENAME            COMM
    ---------- ----------
    TURNER              0
    ALLEN             300
    WARD              500
    MARTIN           1400
    SMITH
    JONES
    JAMES
    MILLER
    FORD
    ADAMS
    BLAKE
  4. CLARK
    SCOTT
    KING
  5. 14 rows selected. 

이 글은 스프링노트에서 작성되었습니다.

Posted by Gungume
,

 정규형

제1정규형

모든 domain이 atomic value만으로 된 테이블

한 컬럼에 여러개의 값이 있는 경우 따로 테이블로 뺀다

 

제2정규형

기본키 전체 조합에 모든 Attribute가 의존적

부분함수종속성(기본키가 2개의 컬럼으로 구성된 경우, 특정 컬럼이 일부 컬럼에만 의존적인것) 없애는 것

부분함수종속성이 되는 컬럼을 따로 테이블로 뺀다

 

제3정규형

기본키가 아닌 값은 모두 기본키에 의존적이어야한다.

이행적함수종속성(기본키가 아닌 것들끼리 의존관계가 있는 경우) 없애는 것

 

정규화 목적

이상문제를 해결하기 위해서

성능상의 문제로 이상문제가 있어도 정규화 안하는 경우도 있음.

 

정규화문제.xls 정규화문제_답.xls

이 글은 스프링노트에서 작성되었습니다.

Posted by Gungume
,

Basic Select Example (P2-3)

  • emp 테이블에서 모든 정보 추출
  1.  SQL> SELECT *  FROM emp;
  2.  
  3.      EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
    ---------- ---------- --------- ---------- -------- ---------- ----------
        DEPTNO
    ----------
          7369 SMITH      CLERK           7902 80/12/17        800
            20
  4.       7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
            30
  5.       7521 WARD       SALESMAN        7698 81/02/22       1250        500
            30

  6.      EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
    ---------- ---------- --------- ---------- -------- ---------- ----------
        DEPTNO
    ----------
          7566 JONES      MANAGER         7839 81/04/02       2975
            20
  7.       7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
            30
  8.       7698 BLAKE      MANAGER         7839 81/05/01       2850
            30

  9.      EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
    ---------- ---------- --------- ---------- -------- ---------- ----------
        DEPTNO
    ----------
          7782 CLARK      MANAGER         7839 81/06/09       2450
            10
  10.       7788 SCOTT      ANALYST         7566 87/04/19       3000
            20
  11.       7839 KING       PRESIDENT            81/11/17       5000
            10

  12.      EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
    ---------- ---------- --------- ---------- -------- ---------- ----------
        DEPTNO
    ----------
          7844 TURNER     SALESMAN        7698 81/09/08       1500          0
            30
  13.       7876 ADAMS      CLERK           7788 87/05/23       1100
            20
  14.       7900 JAMES      CLERK           7698 81/12/03        950
            30

  15.      EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
    ---------- ---------- --------- ---------- -------- ---------- ----------
        DEPTNO
    ----------
          7902 FORD       ANALYST         7566 81/12/03       3000
            20
  16.       7934 MILLER     CLERK           7782 82/01/23       1300
            10

  17. 14 rows selected.

 

 

  • 1000줄을 한 페이지로 설정 (P2-3)
  1. SQL> SET pagesize 1000
    SQL> SELECT ename FROM emp;
  2.  
  3. ENAME
    ----------
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
  4. 14 rows selected.

 

 

Arithmetic Expressions (P2-4)

  • SELECT 구문에 연산자 사용 (P2-5)
  1. SQL> SELECT ename, sal+100 FROM emp;
  2.  
  3. ENAME         SAL+100
    ---------- ----------
    SMITH             900
    ALLEN            1700
    WARD             1350
    JONES            3075
    MARTIN           1350
    BLAKE            2950
    CLARK            2550
    SCOTT            3100
    KING             5100
    TURNER           1600
    ADAMS            1200
    JAMES            1050
    FORD             3100
    MILLER           1400
  4. 14 rows selected.

 

 

Null Value (P2-6)

  • comm 컬럼에서 출력안되는 값은 null 값
  • null 값은 0이나 space 등과는 다름
  1. SQL> SELECT ename, comm FROM emp;
  2.  
  3. ENAME            COMM
    ---------- ----------
    SMITH
    ALLEN             300
    WARD              500
    JONES
    MARTIN           1400
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER              0
    ADAMS
    JAMES
    FORD
    MILLER
  4. 14 rows selected.

 

 

NVL Function (P2-8)

  •  null 값에 계산을 하면 항상 null 값
  1. SQL> SELECT ename, comm, comm+100 FROM emp;
  2.  
  3. ENAME            COMM   COMM+100
    ---------- ---------- ----------
    SMITH
    ALLEN             300        400
    WARD              500        600
    JONES
    MARTIN           1400       1500
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER              0        100
    ADAMS
    JAMES
    FORD
    MILLER
  4. 14 rows selected.

 

  • 연봉 정보를 구하려고 했지만 null값이 있는 경우 계산안됨
  1. SQL> SELECT sal, comm, (sal+comm)*12 FROM emp;
  2.  
  3.        SAL       COMM (SAL+COMM)*12
    ---------- ---------- -------------
           800
          1600        300         22800
          1250        500         21000
          2975
          1250       1400         31800
          2850
          2450
          3000
          5000
          1500          0         18000
          1100
           950
          3000
          1300
  4. 14 rows selected.

 

  • comm 컬럼이 null인 경우 0을 반환 시킨 후 연봉계산
  1. SQL> SELECT sal, comm, (sal+NVL(comm, 0))*12 FROM emp;
  2.  
  3.        SAL       COMM (SAL+NVL(COMM,0))*12
    ---------- ---------- --------------------
           800                            9600
          1600        300                22800
          1250        500                21000
          2975                           35700
          1250       1400                31800
          2850                           34200
          2450                           29400
          3000                           36000
          5000                           60000
          1500          0                18000
          1100                           13200
           950                           11400
          3000                           36000
          1300                           15600
  4. 14 rows selected.

 

  • 아래 NVL() 사용시 오류 원인
  • mgr은 정수형인데 NVL에서 'No Manager'는 문자열형이라서~
  1. SQL> SELECT NVL(mgr, 'No Manager') FROM emp;
    SELECT  NVL(mgr, 'No Manager') FROM  emp
                    *
    ERROR at line 1:
    ORA-01722: invalid number

  2. SQL> DESC emp;
     Name                                      Null?    Type
     ----------------------------------------- -------- ------------
  3.  EMPNO                                     NOT NULL NUMBER(4)
     ENAME                                              VARCHAR2(10)
     JOB                                                VARCHAR2(9)
     MGR                                                NUMBER(4)
     HIREDATE                                           DATE
     SAL                                                NUMBER(7,2)
     COMM                                               NUMBER(7,2)
     DEPTNO                                             NUMBER(2)

 

 

Column Alias (P2-10)

  • 컬럼 Alias => (sal+comm)*12을 연봉으로 표시
  • AS는 선택사항 ',' 없이 연속으로 쓰면 됨 => SELECT sal 봉급, comm 커미션, (sal+comm)*12 연봉 FROM emp;
  1. SQL> SELECT sal, comm, (sal+comm)*12 AS 연봉 FROM emp;
  2.  
  3.        SAL       COMM       연봉
    ---------- ---------- ----------
           800
          1600        300      22800
          1250        500      21000
          2975
          1250       1400      31800
          2850
          2450
          3000
          5000
          1500          0      18000
          1100
           950
          3000
          1300
  4. 14 rows selected.

 

 

Concatenation Operator (P2-12)

  • concat 연산자( '||' ) : 문자열 연결
  1. SQL> SELECT ename || job FROM emp;
  2.  
  3. ENAME||JOB
    -------------------
    SMITHCLERK
    ALLENSALESMAN
    WARDSALESMAN
    JONESMANAGER
    MARTINSALESMAN
    BLAKEMANAGER
    CLARKMANAGER
    SCOTTANALYST
    KINGPRESIDENT
    TURNERSALESMAN
    ADAMSCLERK
    JAMESCLERK
    FORDANALYST
    MILLERCLERK
  4. 14 rows selected.

 

 

Literals (P2-14)

  1. SQL> SELECT 'emp# of' || ename || ' is' || empno FROM emp;
  2.  
  3. 'EMP#OF'||ENAME||'IS'||EMPNO
    ------------------------------------------------------------
    emp# ofSMITH is7369
    emp# ofALLEN is7499
    emp# ofWARD is7521
    emp# ofJONES is7566
    emp# ofMARTIN is7654
    emp# ofBLAKE is7698
    emp# ofCLARK is7782
    emp# ofSCOTT is7788
    emp# ofKING is7839
    emp# ofTURNER is7844
    emp# ofADAMS is7876
    emp# ofJAMES is7900
    emp# ofFORD is7902
    emp# ofMILLER is7934
  4. 14 rows selected.

 

 

Duplicate Values (P2-16)

  • 기본값 ALL 생략됨
  • select deptno, job from emp; == select ALL deptno, job from emp;
  • ALL : 모든 내용 출력
  1. SQL> SELECT ALL deptno, job FROM emp;
  2.  
  3.     DEPTNO JOB
    ---------- ---------
            20 CLERK
            30 SALESMAN
            30 SALESMAN
            20 MANAGER
            30 SALESMAN
            30 MANAGER
            10 MANAGER
            20 ANALYST
            10 PRESIDENT
            30 SALESMAN
            20 CLERK
            30 CLERK
            20 ANALYST
            10 CLERK
  4. 14 rows selected.

 

  • DISTINCT : 중복된 레코드는 하나만 출력 
  1. SQL> SELECT DISTINCT deptno, job FROM emp;
  2.  
  3.     DEPTNO JOB
    ---------- ---------
            10 CLERK
            10 MANAGER
            10 PRESIDENT
            20 ANALYST
            20 CLERK
            20 MANAGER
            30 CLERK
            30 MANAGER
            30 SALESMAN
  4. 9 rows selected.

 

 

CASE (P2-18)

  • depeno에 따라 sal 내용 달라짐
  • new_sal -> alias 
  1. SQL> SELECT ename, CASE deptno WHEN 10 THEN sal*1.1
      2  WHEN 20 THEN sal*1.2
      3  ELSE sal END new_sal
      4  FROM emp;
  2.  
  3. ENAME         NEW_SAL
    ---------- ----------
    SMITH             960
    ALLEN            1600
    WARD             1250
    JONES            3570
    MARTIN           1250
    BLAKE            2850
    CLARK            2695
    SCOTT            3600
    KING             5500
    TURNER           1500
    ADAMS            1320
    JAMES             950
    FORD             3600
    MILLER           1430
  4. 14 rows selected.

 

 

WHERE (2-19)

  • 조건에 만족되는 데이터만 출력됨
  1. SQL> SELECT dname FROM dept WHERE dname = 'SALES';
  2. DNAME
    --------------
    SALES

 

  1. SQL> SELECT ename, sal FROM emp WHERE sal BETWEEN 1500 AND 2000;
  2. ENAME             SAL
    ---------- ----------
    ALLEN            1600
    TURNER           1500

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by Gungume
,

DB & DBMS

  • DMBS => Oracle, DB2...
  • Data를 그냥 파일로 이용시 문제점(파일시스템 이용)

Data 갱신, 삽입 시 관련 코드 직접 코딩해야함

Data 공유 어려워짐(공유시 발생하는 문제 해결 위한 코드작성이 어려움)

Data 중복발생(2번의 공유 문제 발생시 파일데이터를 복사해서 사용)

Data 일관성 깨짐(Data 중복이 발생되면 데이터 수정 등의 작업시 각각의 데이터의 내용이 다름)

보안문제

 

  • DBMS를 사용하면 위의 파일시스템 이용시 문제점 해결가능

Data 갱신, 삽입 문제 -> SQL로 해결

Data 공유 가능, 동시성문제 해결

사용자관리, 권한관리 등 이용한 보안문제 해결

 

 

 E-R 그리기

  • 기자재 E-R그리기

1. 조건

하나의 기자재는 한 연구실에서 관리한다.
한 연구실은 여러 기자재를 관리한다.
한명의 연구원은 한 연구실에만 소속될 수 있다.
하나의 연구실은 여러 연구원으로 구성된다.
한명의 연구원이 여러 기자재를 사용할 수 있다
하나의 기자재는 여러 연구원이 사용할 수 있다.

 

2. 필요한 attribute

기자재번호, 기자재이름, 기자재입고날짜,
기자재사용날짜, 기자재 사용 번호,
연구원 번호, 연구원 이름,
연구실 번호, 연구실 이름

 

 ERD.png

 

 

SQLPLUS 사용 (P1-11)

  • 콘솔창에서 sqlplus 실행 : sqlplus /nolog
  1. C:\Documents and Settings\bitacademy>sqlplus /nolog

  2. SQL*Plus: Release 10.1.0.2.0 - Production on 월 10월 27 15:46:49 2008

  3. Copyright (c) 1982, 2004, Oracle.  All rights reserved.

 

  • 연결 : conn system/system (DB내의 system의 schema로 접속)
  1. SQL> conn system/system

  2. Connected.

 

  • 테이블 목록보기(system 계정에 해당되는~)
  1. SQL> SELECT table_name FROM tabs;

  2.  

  3. TABLE_NAME

  4. ------------------------------

  5. MVIEW$_ADV_PARTITION

  6. MVIEW$_ADV_INDEX

  7. HELP

  8. SQLPLUS_PRODUCT_PROFILE

  9. REPCAT$_SITES_NEW

  10. REPCAT$_EXTENSION

  11. REPCAT$_INSTANTIATION_DDL

  12. REPCAT$_EXCEPTIONS

  13. REPCAT$_TEMPLATE_TARGETS

  14. REPCAT$_RUNTIME_PARMS

  15. REPCAT$_SITE_OBJECTS


  16. TABLE_NAME

  17. ------------------------------

  18. REPCAT$_TEMPLATE_SITES

  19. REPCAT$_USER_PARM_VALUES

  20. REPCAT$_OBJECT_PARMS

  21. REPCAT$_TEMPLATE_PARMS

  22. REPCAT$_TEMPLATE_OBJECTS

  23. REPCAT$_TEMPLATE_REFGROUPS

  24. REPCAT$_OBJECT_TYPES

  25. REPCAT$_USER_AUTHORIZATIONS

  26. REPCAT$_REFRESH_TEMPLATES

  27. REPCAT$_TEMPLATE_TYPES

  28. REPCAT$_TEMPLATE_STATUS


  29. TABLE_NAME

  30. ------------------------------

  31. REPCAT$_FLAVOR_OBJECTS

  32. REPCAT$_AUDIT_COLUMN

  33. REPCAT$_AUDIT_ATTRIBUTE

  34. REPCAT$_PARAMETER_COLUMN

  35. REPCAT$_RESOL_STATS_CONTROL

  36. REPCAT$_RESOLUTION_STATISTICS

  37. REPCAT$_RESOLUTION

  38. REPCAT$_RESOLUTION_METHOD

  39. REPCAT$_CONFLICT

  40. REPCAT$_GROUPED_COLUMN

  41. REPCAT$_COLUMN_GROUP


  42. TABLE_NAME

  43. ------------------------------

  44. REPCAT$_PRIORITY

  45. REPCAT$_PRIORITY_GROUP

  46. REPCAT$_REPGROUP_PRIVS

  47. REPCAT$_DDL

  48. REPCAT$_REPCATLOG

  49. REPCAT$_REPPROP

  50. REPCAT$_GENERATED

  51. REPCAT$_KEY_COLUMNS

  52. REPCAT$_REPCOLUMN

  53. REPCAT$_REPOBJECT

  54. REPCAT$_SNAPGROUP


  55. TABLE_NAME

  56. ------------------------------

  57. REPCAT$_REPSCHEMA

  58. REPCAT$_FLAVORS

  59. REPCAT$_REPCAT

  60. LOGSTDBY$HISTORY

  61. LOGSTDBY$SKIP_SUPPORT

  62. LOGSTDBY$SKIP

  63. LOGSTDBY$SKIP_TRANSACTION

  64. LOGSTDBY$PLSQL

  65. LOGSTDBY$SCN

  66. LOGSTDBY$APPLY_MILESTONE

  67. LOGSTDBY$EVENTS


  68. TABLE_NAME

  69. ------------------------------

  70. LOGSTDBY$PARAMETERS

  71. DEF$_PUSHED_TRANSACTIONS

  72. DEF$_ORIGIN

  73. DEF$_PROPAGATOR

  74. DEF$_TEMP$LOB

  75. DEF$_LOB

  76. DEF$_DEFAULTDEST

  77. DEF$_CALLDEST

  78. DEF$_DESTINATION

  79. DEF$_ERROR

  80. DEF$_AQERROR


  81. TABLE_NAME

  82. ------------------------------

  83. DEF$_AQCALL

  84. AQ$_INTERNET_AGENT_PRIVS

  85. AQ$_INTERNET_AGENTS

  86. AQ$_SCHEDULES

  87. AQ$_QUEUES

  88. AQ$_QUEUE_TABLES

  89. MVIEW$_ADV_PLAN

  90. MVIEW$_ADV_JOURNAL

  91. MVIEW$_ADV_INFO

  92. MVIEW$_ADV_PARAMETERS

  93. MVIEW$_ADV_EXCEPTIONS


  94. TABLE_NAME

  95. ------------------------------

  96. MVIEW$_ADV_OUTPUT

  97. MVIEW$_ADV_ELIGIBLE

  98. MVIEW$_ADV_CLIQUE

  99. MVIEW$_ADV_GC

  100. MVIEW$_ADV_FJG

  101. MVIEW$_ADV_AJG

  102. MVIEW$_ADV_ROLLUP

  103. MVIEW$_ADV_LEVEL

  104. MVIEW$_ADV_FILTERINSTANCE

  105. MVIEW$_ADV_LOG

  106. MVIEW$_ADV_FILTER


  107. TABLE_NAME

  108. ------------------------------

  109. MVIEW$_ADV_TEMP

  110. MVIEW$_ADV_PRETTY

  111. MVIEW$_ADV_SQLDEPEND

  112. MVIEW$_ADV_BASETABLE

  113. MVIEW$_ADV_WORKLOAD

  114. MVIEW$_ADV_OWB

  115. LOGSTDBY$APPLY_PROGRESS

  116. LOGMNR_SESSION$

  117. LOGMNR_RESTART_CKPT$

  118. LOGMNR_ERROR$

  119. LOGMNR_RESTART_CKPT_TXINFO$


  120. TABLE_NAME

  121. ------------------------------

  122. LOGMNR_AGE_SPILL$

  123. LOGMNR_SPILL$

  124. LOGMNR_PROCESSED_LOG$

  125. LOGMNR_LOG$

  126. LOGMNR_INDCOMPART$

  127. LOGMNR_INDSUBPART$

  128. LOGMNR_INDPART$

  129. LOGMNR_LOBFRAG$

  130. LOGMNR_ICOL$

  131. LOGMNR_CCOL$

  132. LOGMNR_CDEF$


  133. TABLE_NAME

  134. ------------------------------

  135. LOGMNR_LOB$

  136. LOGMNR_ATTRIBUTE$

  137. LOGMNR_COLTYPE$

  138. LOGMNR_TYPE$

  139. LOGMNR_TABCOMPART$

  140. LOGMNR_TABSUBPART$

  141. LOGMNR_TABPART$

  142. LOGMNR_IND$

  143. LOGMNR_TS$

  144. LOGMNR_ATTRCOL$

  145. LOGMNR_COL$


  146. TABLE_NAME

  147. ------------------------------

  148. LOGMNR_TAB$

  149. LOGMNRC_GSII

  150. LOGMNRC_GTCS

  151. LOGMNRC_GTLO

  152. LOGMNR_USER$

  153. LOGMNR_OBJ$

  154. LOGMNR_DICTIONARY$

  155. LOGMNR_DICTSTATE$

  156. LOGMNRC_DBNAME_UID_MAP

  157. LOGMNR_UID$

  158. LOGMNR_HEADER2$


  159. TABLE_NAME

  160. ------------------------------

  161. LOGMNR_HEADER1$

  162. LOGMNR_SESSION_EVOLVE$

  163. OL$NODES

  164. OL$HINTS

  165. OL$


  166. 137 rows selected.


  • scott 계정 락 풀기
  1. SQL> ALTER user scott account unlock;

  2. User altered.


  • scott 계정으로 다시 연결 및 비밀번호 변경
  1. SQL> conn scott/tiger
  2. ERROR:
  3. ORA-28001: the password has expired.
  4.  
  5. // scott 계정 비밀번호 변경
  6. Changing password for scott
  7. New password:
  8. Retype new password:
  9. Password changed
  10. Connected.
  11. SQL> conn scott/tiger
  12. Connected.

 

  • 테이블 목록보기(scott 계정에 해당되는~)
  1. SQL> SELECT table_name FROM tabs;
  2.  
  3. TABLE_NAME
  4. ------------------------------
  5. SALGRADE
  6. BONUS
  7. EMP
  8. DEPT
  9.  
  10. // 테이블 내용보기
  11. SQL> DESC emp;
  12. Name                                      Null?    Type
  13. ----------------------------------------- -------- ----------------------------
  14. EMPNO                                     NOT NULL NUMBER(4)
  15. ENAME                                              VARCHAR2(10)
  16. JOB                                                VARCHAR2(9)
  17. MGR                                                NUMBER(4)
  18. HIREDATE                                           DATE
  19. SAL                                                NUMBER(7,2)
  20. COMM                                               NUMBER(7,2)
  21. DEPTNO                                             NUMBER(2) 

이 글은 스프링노트에서 작성되었습니다.

Posted by Gungume
,

ListViewItem 복사

Language/C# 2008. 12. 16. 10:00
하나의 ListView에서 다른 ListView로 모든 데이터를 복사하고 싶을 때 아래와 같이 코딩을 하면 오류가 발생한다.

foreach (ListViewItem item in listViewA.Items)
{
     listViewB.Items.Add(item);
}

위의 코드 수행에 따른 오류 메시지를 보면 "두 개 이상의 위치에 'xxx' 항목을 추가하거나 삽입할 수 없습니다. 먼저 항목의 현재 위치에서 항목을 제거하거나 복제해야 합니다."라고 나온다.

오류메시지를 대략 보면 foreach 구문에서 item이 참조형식으로 받아오기 때문에 생기는 문제같다. 오류메시지에 나온 해결방법중 복제하는 방법을 코드로 옮기면 아래와 같다.

아래 코드를 실행해보면 원하는데로 동작한다.
foreach (ListViewItem item in listViewA.Items)
{
     listViewB.Items.Add((ListViewItem)item.Clone());
}


좀더 자세한 내용은 MSDN Forums(copy listview item to another listview.) 참조...
Posted by Gungume
,

개발자용 글꼴...

자료실 2008. 12. 4. 22:43
MS에서 몇년전에 배포한 개발자용 글꼴 중 Consolas라는 글꼴이 있는데 윈도우에서 ClearType를 설정해주고 사용하면 깔끔하게 나온다.

그런데 영문만 지원해서 한글 사용시에는 아래와 같이 영문과 비교해서 글씨가 커져서 별로 보기 안좋다.



개인적으로 그냥 쓰다가 최근에 글꼴을 합칠 수 있는 프로그램이 있다는 것을 알고서 Consolas에 맑은고딕을 붙혔다.



프로그램을 잘못써서 그런건지 글씨 크기에 따라서 좀 이상하게 나오는 경우도 있기하나 평소 내가 쓰는 크기에서는 딱히 문제되는 부분이 없어서 그냥 사용중~


참고로 원래 MS에서 제공하는 Consolas 글꼴 다운로드 사이트는 아래 링크에 있다~
Posted by Gungume
,
이번에 졸업작품으로 만든 프로그램으로 C#으로 만들었다.

주제가 좀 평범해서 몇가지 경우에 대해서는 소켓통신 대신에 WMI를 사용했다는 것이 조금 다를뿐이다...

원래는 기본기능 외에 부가적인 기능과 PC재배치 등에 대한 기능을 좀더 유동적으로 만들려고 했는데 예정에 없던 산업체현장실습과 교육 등으로 인해 실제 개발에 투자한 시간이 몇주밖에 되지않아 기본기능만 구현했다;;;

나름 핵심기능은 WMI를 이용해서 PC의 전원 및 프로세스, 레지스트리 관리정도와 소켓통신을 이용한 원격제어 등이다...

아래는 전체시스템 구성도로 중앙서버(=메인서버)와 클라이언트(관리할 PC들)로 구성된다.

관리를 하기위한 기능은 대부분 서버에서 이루어지고, 클라이언트는 처음 실행시 학번을 통해서 로그인을 하고 이후에는 백그라운드로 실행되면서 서버에서 요청한 정보를 전송해주는 기능정도만 한다..

- 전체시스템 구성도 -
전체시스템 구성도



- 서버 -




- 클라이언트 -



- 프로세스 정보 -
WMI를 이용해서 원격지의 프로세스 정보를 얻어옴
왼쪽은 구현한 프로그램에서 얻어온 프로세스 정보이고 오른쪽은 윈도우의 작업관리자에서 얻어온 프로세스 정보
프로그램상에서 선택한 프로세스에 대한 Kill 가능~



- 원격탐색기 -
소켓통신을 이용해서 원격지의 폴더 & 파일 정보를 얻어옴
파일전송 기능을 넣고 싶었지만 시간이 부족했다;;;
역시 왼쪽은 구현한 프로그램, 오른쪽은 윈도우의 탐색기



- 화면캡쳐 -
소켓통신을 이용해서 원격컴퓨터의 화면을 캡쳐해옴
버튼 클릭에 따른 캡쳐 및 설정된 타이머간격으로 캡쳐가능
캡쳐된 화면 JPG, BMP, PNG 파일로 저장가능



- 윈도우최적화 -
WMI를 사용 원격컴퓨터의 레지스트리를 변경해서 윈도우최적화



- 원격제어 -
소켓통신을 이용한 원격제어
화면캡쳐를 이용한 원격제어
기본적인 키보드 & 마우스제어 가능

Posted by Gungume
,
C#을 이용한 정렬 알고리즘을 공부하다가 찾은 해외 사이트이다.

소스코드가 깔끔하게 잘되있고, 정렬외에도 유용한 자료가 많다.










Posted by Gungume
,

Renamer4.exe

 파일명 일괄변경 프로그램 - 4


도깨비님의 요청에 의해 오랜만에 리네이머에 손을 봤다.


우선 기존에 일련번호 제작에 썼던 문자인 '#'을 '*'로 변경했다. 일련번호가 숫자라는 의미로 그냥 #으로 썼었는데 파일명에 #을 써야하는 경우 때문에 변경을 했다.

도깨비님은 escape sequence를 이용해서 파일명에 '#'을 입력할 수 있게 해달라고 요청을 하셨는데 코딩하다보니 어차피 '*'표는 파일명으로 사용을 못하기 때문에 일련번호에 쓰일 문자를 아예 변경하는 것이 더 편하다고 생각되서 현재처럼 변경했다.

그리고 문자 집합을 기존 '멀티바이트 문자 집합'에서 '유니코드 문자 집합'으로 변경함으로써 파일명 변경시 유니코드를 지원한다.

프로젝트 설정에서 문자 집합을 '유니코드 문자 집합'으로 변경하고 문자열 처리와 관련된 변수 선언과 함수 등을 유니코드와 관련된 것으로 바꾸긴 했는데, 여지까지 유니코드 프로그래밍을 안해봤고, 현재 한글OS만 사용중이라서 완벽한 테스트는 하지 못했다.

단순히 키보드입력기에 일본어를 추가하고 테스트해보니 기존 버전에서는 파일명을 바꾸지 못했는데, 이번 버전에서는 파일명을 문제없이 변경했다.

Source: https://github.com/gungume/Renamer/releases/tag/0.4

(사용언어 및 제작툴 : MFC / VS2008)

이전 버전 받기
2006/09/05 - [MFC/Application] - 파일명 일괄변경 프로그램
2007/05/31 - [MFC/Application] - 파일명 일괄변경 프로그램 - 2
2007/12/29 - [MFC/Application] - 파일명 일괄변경 프로그램 - 3

Posted by Gungume
,


이번 포스팅에서는 소켓을 이용해서 이미지를 송수신하는 방법과 이때 필요한 데이터를 적절할 형식으로 형변환하는 과정에 대해 설명한다.

송수신될 이미지는 Bitmap 객체에 저장해서 사용하는데, 이 Bitmap 객체(=이미지 데이터)를 네트워크상에 보낼때는 바이트형으로 형변환을 한다.

이때 비트맵을 바이트형으로 형변환하는 이유는 네트워크상에서 이미지를 전송하는 방법이 여러가지가 있겠지만 간단하게 Socket 클래스의 Send(), Receive() 메소드를 사용한다면 이 메소드의 매개변수인 데이터버퍼가 byte[]형이기 때문이다.

이미지 송신측

이미지 수신측


우선 위의 데모프로그램을 설명하면 서버/클라이언트 구조로 작동을 하는데 Sender쪽에서 서버의 역할로 자신의 컴퓨터 전체화면을 캡쳐해서 이미지를 전송하고, Receiver쪽에서는 그 이미지를 받아서 화면에 출력해준다.
(전체화면 캡쳐하는 방법은 이전 글 참조...(클릭))

다음은 비트맵 이미지와 바이트형간의 형변환을 하는 소스의 일부이다.

// Bitmap To byte[]
Bitmap bitmap;	// 이미지가 저장된 bitmap객체
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
ms.Position = 0;
byte[] data = ms.ToArray();


// byte[] To Bitmap
byte[] data;	// 전송된 이미지를 받은 버퍼
MemoryStream ms = new MemoryStream();
ms.Write(data, 0, (int)data.Length);
Bitmap bitmap = new Bitmap(ms);


소스를 보면 알겠지만 MemoryStream을 중간 매개체로 해서 간단하게 형변환을 한다.


먼저 비트맵을 바이트형으로 변환하는 소스(=Bitmap To byte[])부터 설명하겠다.

가장 위에 있는 bitmap 객체에 전송할 이미지 정보가 있다고 가정하고 이 이미지 정보를 메모리스트림에 저장한다. 그 이후에 메모리스트림의 ToArray()메소드를 이용해서 새로 생성한 byte[]형의 변수에 저장함으로써 형변환이 끝난다. 이렇게 형변환이 끝나면 최종 데이터인 data 변수를 Socket.Send() 메소드에 넣어줌으로써 이미지를 전송할 수 있다.


다음으로 바이트형을 비트맵으로 변환하는 소스(=byte[] To Bitmap)에 대해 설명하겠다.

Bitmap To byte[] 를 처리하는 과정과 거의 비슷한데, Socket.Receive()메소드를 통해서 전송된 이미지 정보를 data변수에 저장했다고 가정하고 이 데이터를 메모리스트림에 저장한다. 그 다음에 Bitmap 객체를 생성하면서 생성자에 메모리스트림 객체를 넣어줌으로써 간단히 형변환이 끝난다. 이렇게 형변환이 끝난 최종 데이터인 bitmap 객체를 이용해서 이미지 정보를 사용할 수 있다.

Source: https://github.com/gungume/BlogSamples/tree/master/ImageTransport
(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2008 / 3.5)

Posted by Gungume
,