2008. 10. 3. 17:26

SP - insertuser


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  Hwang Jun - Beom
-- Create date: 2007/03/23
-- Description: insert user
-- =============================================
ALTER PROCEDURE [dbo].[insertuser_sp]
 -- Add the parameters for the stored procedure here
 @id  VARCHAR(15),
 @passwd  VARCHAR(20),
 @name  VARCHAR(10),
 @season  DECIMAL(3,0),
 @email  VARCHAR(50),
 @phone  VARCHAR(11),
 @university INT,
 @major  INT,
 @ipaddress VARCHAR(3),
 @result  int OUTPUT
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

    -- Insert statements for procedure here
 DECLARE @i_count int;
 SELECT @i_count = count(*) FROM userdb WHERE userid = @id;

 IF @i_count != 0
  BEGIN
   SET @result = 1;
   RETURN;
  END

 INSERT INTO userdb VALUES(@id, @passwd, @name, @season, @email, @phone, @university, @major, @ipaddress);

 DECLARE @i_useridx int;
 SELECT @i_useridx = idx FROM userdb WHERE userid = @id;
 INSERT INTO auth VALUES(0, @i_useridx);
 
 SET @result = 0;
 RETURN;
END

 

2008. 10. 3. 17:24

DB 구성


USER --

CREATE TABLE university (
 idx  INT IDENTITY(0,1),
 university VARCHAR(30) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (university)
)

CREATE TABLE major (
 idx  INT IDENTITY(0,1),
 major  VARCHAR(20) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (major)
)

CREATE TABLE userdb (
 idx  INT IDENTITY(0,1),
 userid  VARCHAR(15) NOT NULL,
 passwd  VARCHAR(20) NOT NULL,
 username VARCHAR(10) NOT NULL,
 season  DECIMAL(3,0) NOT NULL,
 email  VARCHAR(50) NOT NULL,
 phone  VARCHAR(11) NOT NULL,
 university  INT NOT NULL,
 major   INT NOT NULL,
 PRIMARY KEY (idx),
 FOREIGN KEY (university) REFERENCES university (idx),
 FOREIGN KEY (major) REFERENCES major (idx),
 UNIQUE (userid)
)
 

AUTH --

CREATE TABLE authcode (
 idx  INT IDENTITY(0,1),
 auth  VARCHAR(10) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (auth)
)
 
CREATE TABLE auth (
 authcode INT NOT NULL,
 useridx  INT NOT NULL,
 PRIMARY KEY (authcode, useridx),
 FOREIGN KEY (authcode) REFERENCES authcode (idx),
 FOREIGN KEY (useridx) REFERENCES userdb (idx)
)


BOOK --

CREATE TABLE typecode (
 idx  INT IDENTITY(0,1),
 type  VARCHAR(10) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (type)
)

CREATE TABLE bookgroupcode (
 idx  INT IDENTITY(0,1),
 bookgroup VARCHAR(20) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (bookgroup)
)

CREATE TABLE positioncode (
 idx  INT IDENTITY(0,1),
 position VARCHAR(4) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (position)
)


CREATE TABLE book (
 idx  INT IDENTITY(0,1),
 isbn  VARCHAR(11) NOT NULL, // ISBN
 picture  VARCHAR(255),  // 그림
 typecode INT NOT NULL,  // 책/잡지
 bookname VARCHAR(100) NOT NULL, // 서명
 publisher VARCHAR(50) NOT NULL, // 출판사
 author  VARCHAR(50) NOT NULL, // 저자
 cd  BIT DEFAULT 0,  // CD 유무 0: 없음, 1: 있음
 term  DECIMAL(3) DEFAULT 30, // 대출제한 일단위
 bookgroup INT NOT NULL,  // JAVA, C, C++, OPERATING SYSTEM 등
 position INT NOT NULL,   // 도서 위치 A-1, I-3, G-10 등
 purchasedate SMALLDATETIME NOT NULL DEFAULT GETDATE(),
 publishdate SMALLDATETIME NOT NULL DEFAULT GETDATE(),
 samecount TINYINT DEFAULT '1',    // 도서 권수
 PRIMARY KEY (idx),
 FOREIGN KEY (typecode) REFERENCES typecode (idx),
 FOREIGN KEY (bookgroup) REFERENCES bookgroupcode (idx),
 FOREIGN KEY (position) REFERENCES positioncode (idx),
 UNIQUE (isbn)
)

CREATE TABLE bookrequestdate (
 beginday INT NOT NULL DEFAULT 27,
 endday  INT NOT NULL DEFAULT 1
)

CREATE TABLE lending (
 idx  INT IDENTITY(0,1),
 bookidx  INT NOT NULL,  // ISBN
 useridx  INT NOT NULL,  // 사용자 ID
 returnplan SMALLDATETIME NOT NULL, // 예정반납일   ----
 lendday  SMALLDATETIME NOT NULL, // 대출일
 PRIMARY KEY (idx)
 UNIQUE (bookidx, useridx, lendday),
 FOREIGN KEY (bookidx) REFERENCES book (idx),
 FOREIGN KEY (useridx) REFERENCES userdb (idx)
)

CREATE TABLE lendhistory (
 bookidx  INT NOT NULL,
 useridx  INT NOT NULL,
 username VARCHAR(10) NOT NULL,
 userseason DECIMAL(3,0) NOT NULL,
 typecode INT NOT NULL,
 bookname VARCHAR(100) NOT NULL,
 publisher VARCHAR(50) NOT NULL,
 author  VARCHAR(50) NOT NULL,
 returnplan SMALLDATETIME NOT NULL,
 lendday  SMALLDATETIME NOT NULL,
 returnday SMALLDATETIME NOT NULL, // 실제반납일
 PRIMARY KEY (bookidx, useridx)
)
 

CREATE TABLE requestbook (
 idx  INT IDENTITY(0,1),
 useridx  INT NOT NULL,
 bookname VARCHAR(100) NOT NULL,
 requestdate SMALLDATETIME NOT NULL DEFAULT GETDATE(),
 price  VARCHAR(10) NOT NULL,
 reason  VARCHAR(20) NOT NULL,
 site  VARCHAR(10) NOT NULL,
 link  VARCHAR(200) NOT NULL,
 compare  VARCHAR(100) NOT NULL,
 PRIMARY KEY (idx),
 UNIQUE (useridx, bookname),
 FOREIGN KEY (useridx) REFERENCES userdb (idx)
)

CREATE TABLE reservation (
 idx  INT IDENTITY(0,1),
 bookidx  INT NOT NULL,
 useridx  INT NOT NULL,
 returndate SMALLDATETIME DEFAULT NULL,
 PRIMARY KEY (idx),
 FOREIGN KEY (bookidx) REFERENCES book (idx),
 FOREIGN KEY (useridx) REFERENCES userdb (idx),
 UNIQUE (bookidx, useridx)
)

CREATE TABLE bookreview (
 reviewno INT IDENTITY(0,1),
 bookidx  INT NOT NULL,
 useridx  INT NOT NULL,
 username VARCHAR(10) NOT NULL,
 userseason DECIMAL(3,0) NOT NULL,
 info  TEXT NOT NULL,
 PRIMARY KEY (reviewno),
 FOREIGN KEY (bookidx) REFERENCES book (idx)
)


LENDINGCOUNT_VIEW --

CREATE VIEW lendingcount_view AS
 SELECT bookidx, count(*) AS lendingcount FROM lending GROUP BY bookidx


LENDHISTORYCOUNT_VIEW --

CREATE VIEW lendhistorycount_view AS
 SELECT bookidx, count(*) AS lendhistorycount FROM lendhistory GROUP BY bookidx


LENDCOUNTER_VIEW --

CREATE VIEW lendcount_view AS
 SELECT A.bookidx, (A.lendingcount + ISNULL(B.lendhistorycount, 0)) AS lendcount
  FROM lendingcount_view A FULL OUTER JOIN lendhistorycount_view B ON A.bookidx = B.bookidx


BOOKINFO --

CREATE VIEW bookinfo_view AS
 SELECT A.idx, A.isbn, A.picture, A.bookname, A.publisher, A.author, A.cd, A.term, A.samecount, A.purchasedate, A.publishdate,
  B.type, C.bookgroup, D.position, (A.samecount - ISNULL(E.lendingcount, 0)) AS lendingcounter,
  F.useridx AS reservation, G.lendcount, A.url
  FROM book A
   LEFT OUTER JOIN lendingcount_view E
    ON A.idx = E.bookidx
   LEFT OUTER JOIN reservation F
    ON A.idx = F.bookidx
   LEFT OUTER JOIN lendcount_view G
    ON A.idx = G.bookidx,
  typecode B,
  bookgroupcode C,
  positioncode D
 WHERE A.typecode = B.idx
  AND A.bookgroup = C.idx
  AND A.position = D.idx


LENDINGINFO_VIEW --

CREATE VIEW lendinginfo_view AS
 SELECT A.idx, F.useridx, F.userid, F.username, C.type, D.bookgroup, E.position, B.bookname, B.term,
  A.bookidx, A.returnplan, A.lendday,
  (B.samecount - ISNULL(G.lendingcount, 0)) AS lendingcounter,
  I.userid AS reservationuserid, I.username AS reservationusername
  FROM lending A
   LEFT OUTER JOIN lendingcount_view G ON A.bookidx = G.bookidx
   LEFT OUTER JOIN reservation H ON A.bookidx = H.bookidx
   LEFT OUTER JOIN userdb I ON H.useridx = I.idx,
   book B, typecode C, bookgroupcode D, positioncode E, userdb F
  WHERE A.bookidx = B.idx
   AND B.typecode = C.idx
   AND B.bookgroup = D.idx
   AND B.position = E.idx
   AND A.useridx = F.idx


LENDHISTORYINFO_VIEW --

CREATE VIEW lendhistoryinfo_view AS
 SELECT F.userid, F.username, ISNULL(C.type, '폐기') AS type, D.bookgroup, E.position, A.bookname, B.term, A.useridx, A.bookidx, A.returnplan, A.lendday, A.returnday
  FROM lendhistory A
   LEFT OUTER JOIN book B ON A.bookidx = B.idx
   LEFT OUTER JOIN typecode C ON B.typecode = C.idx
   LEFT OUTER JOIN bookgroupcode D ON B.position = D.idx
   LEFT OUTER JOIN positioncode E ON B.position = E.idx
   LEFT OUTER JOIN userdb F ON A.useridx = F.idx

REQUESTINFO_VIEW --

CREATE VIEW requestinfo_view AS
 SELECT A.userid, A.username, B.*
  FROM userdb A, requestbook B
  WHERE A.idx = B.useridx


USERINFO_VIEW --

CREATE VIEW userinfo_view AS
 SELECT A.idx, A.season, A.username, A.userid, A.passwd, D.university, E.major, C.auth
  FROM userdb A
   LEFT OUTER JOIN auth B ON A.idx = B.useridx
   LEFT OUTER JOIN authcode C ON B.authcode = C.idx,
   university D, major E
  WHERE A.university = D.idx
   AND A.major = E.idx


INPUT_LENDHISTORY_VIEW --

CREATE VIEW input_lendhistory_view AS
 SELECT A.idx, A.bookidx, A.useridx, C.username, C.season, D.type, B.bookname, B.publisher, B.author, A.returnplan,
  A.lendday, GETDATE() AS returnday
  FROM lending A, book B, userdb C, typecode D
  WHERE A.bookidx = B.idx
   AND A.useridx = C.idx
   AND B.typecode = D.idx


CREATE VIEW reservationinfo_view AS
 SELECT A.idx, A.bookidx, A.useridx, F.userid, F.username, B.bookname, C.type, D.bookgroup, E.position, B.term, (B.samecount - ISNULL(G.lendingcount, 0)) AS lendingcounter, A.returndate
  FROM reservation A LEFT OUTER JOIN lendingcount_view G ON A.bookidx = G.bookidx, book B, typecode C, bookgroupcode D, positioncode E, userdb F
  WHERE A.bookidx = B.idx
   AND B.typecode = C.idx
   AND B.bookgroup = D.idx
   AND B.position = E.idx
   AND A.useridx = F.idx

2008. 10. 3. 17:21

[펌] 주의해야할 기본문법들


이번은 C#이라는 언어를 사용해서 개발하다 보면 언어의 문법 상 조금 주의를 기울여야하는 부분들이 있습니다.
이런 부분들에 대해서 정리를 한번 해보았습니다.

C# Description 1

값 형식 변수는 Stack에 저장되고 참조형식 변수는 Heap에 저장된다.
구조체 및 열거형은 값형식이고 object, string 형은 참조형식이다.
String은 참조형 이지만 동일한 문자열을 가리키는 두 문자열 변수에서 하나를 변경하더라도 다른 하나에는 영향을 미치지 않게 Heap에 별도의 새로운 객체를 할당하게 된다.

[값 형식]
모든 값 형식(Value-Type) 변수는 사용 전에 초기화되어야 한다.
Decimal 형식은 통화량 표시등 금융 계산을 위해 사용되면 Type문자는 M이다.
Char 형은 16비트(유니코드) 문자를 나타낸다.
값 형식이 참조형식에 비해 장점
빨리 할당된다.
변수는 범위에서 벗어나면 자동으로 메모리에서 해지된다.
복사하기 쉽다(=)
구조체 :
구조체는 new 연사자를 사용하지만 new를 호출하기 전에도 실제로 사용가능하고, 이것의 필드에 접근할 수 있다. 구조체는 선언되자마자 초기화될 수 있는데 모든 필드들은 기본값이 0으로 초기화된다. 하지만 컴파일러는 new 키워드를 이용하여 처음 초기화를 시켜주지 않거나 모든 필드의 값을 설정해 주지 않으면, 구조체를 복사하거나 이것의 필드값을 읽을 수 없도록 막고 있다.
구조체의 모든 멤버 데이터는 기본적으로 private이다.
클래스와는 달리 구조체의 인스턴스는 메모리상에 별도의 장소에 할당된다.
구조체의 인스턴스는 스택의 공간을 차지하기 때문에 상대적으로 작은 크기의 객체를 표현하는데 적합하다. 모든 값 데이터 형식을 구현하는데 사용된다.
프로그래머는 다른 함수의 매개변수로 전달해야 하는 값을 한데 묶기 위해 구조체를 사용하는 경우가 대부분이다.

[참조형식]
클래스, 인터페이스, 델리게이트, 배열 등

클래스 : 대부분의 실행파일은 적어도 하나의 클래스를 가지고 있는데 이것은 프로그램의 진입점인 Main 메소드를 가지고 있다.

인터페이스 : 클래스를 구현하는 기능성을 정의하는 데 사용, 프로퍼티, 메소드, 이벤트, 인덱서(Indexer)를 포함할 수 있으나 인스턴스화 될 수 없고, 함수들의 구현을 정의하지 못한다.

델리게이트 : 메소드를 참조하는 데이터 형식, 인스턴스화되어 클래스의 정적메소드나 클래스의 특정 인스턴스의 메소드들을 호출하는데 사용될 수 있다. 실행시에 어떤 메소드를 호출하고자 하는지 결정할 수 있다.

배열: 배열을 초기화하지 않고 선언할 수 있게 때문에 프로그램상에서 동적으로 크기를 변경할 수 있다.
Int[] Integers;
Integers = new int[32];
C# 배열은 다른 C# 객체처럼 CLR에 의해서 관리되기 때문에, 더 이상 참조되지 않으면 자동으로 소멸한다.
아래의 방법으로 초기화 하는 경우, 변수를 사용하여 배열의 크기를 명시하는 것이 불가능


int len=3;
//Not Permitted
string[] String = new string[len] { “first element”, “second element”, “third element”}< /FONT >


하지만 상수는 사용할 수 있다.


Const int len=3
// Permitted
string[] String = new string[len] { “first element”, “second element”, “third element”}< /FONT >


[Type Conversion]
암시적 형변환 : 데이터 형식끼리의 변환은 값이 변하지 않는다는 보장이 있으면 자동으로 이루어 질 수 있다.(short, int 값은 문제없이 long 변수에 대입될 수 있다.)
문자열을 숫자형식으로 바꾸고 싶으면 Parse 메소드 사용

Boxing & UnBoxing
박싱 : 값 형식을 참조 형식으로 변환(값 형식을 object 형식으로 캐스트)
언박싱 : 참조 형식을 값 형식으로 변환

언박싱은 반드시 명시적으로 행해져야 한다.

[변수]
public static int x=10, y=20 //x, y는 둘다 public static int 이다.
Public int x=10, private byte y = 2 //Not Permitted
같은 범위(Scope) 내에서는 같은 이름을 가진 변수들이 선언될 수 없다.


//Permitted
for(int i = 0; i < 10 ; i++)
{
i의 범위는 여기서 끝남
}
using System;
public class ScopeTest
{
static int j = 20; //필드(Field)
public static int Main()
{
int j = 30; //지역변수
Console.WriteLine(j); //30
return 0;
}
}
for(int i = 0; i < 10 ; i++)
{}


변수 한정자
지역변수가 아닌 필드에만 사용가능
- internal : 현재 프로그램에서만 변수에 접근 가능
- new
- private
- protected
- protected internal : 현재 프로그램이나 현재 데이터 형식에서 파생된 데이터 형식으로부터 변수에 접근가능
- public
- readonly : 변수를 일단 한 번 초기화하면 값을 수정할 없다.
- static : 클래스의 인스턴스가 몇 개 생기는가와 상관없이 필드에 대한 하나의 복사본만 생긴다.

상수 : 정적 읽기전용 필드와 유사
필드뿐 아니라 지역변수도 상수로 선언가능
상수는 반드시 선언 시 초기화되어야 한다.
상수는 컴파일시 계산 가능해야 하므로 어떤 변수가 가진 값으로 초기화할 수는 없다.
상수는 항상 Static이다.(static 한정자를 추가할 필요 없음)

[연산자]
Checked & Unchecked
CLR의 스택 오버플로우 처리 방식을 설정
코드의 블록을 CLR은 강제로 오버플로우 체크하고, 오버플로우가 일어나면 예외를 발생시킨다.
Is
Sizeof : 스택에 저장된 값 형식의 크기를 바이트 단위로, 안전하지 않은 코드에서 사용가능

unsafe
{
console.writeline(sizeof(int));
}


typeof : 특정한 데이터 형식을 나타내는 Type 객체를 반환


foreach문 : IEnumerable 인터페이스를 지원하는 컨테이너 클래스의 각 항목들에 대해서 명령문을 수행하는 것이다.

Using 문 : 리소스를 많이 차지하는 객체를 사용한 후에 즉시 처리한다.
Using(object)
{
//object를 사용하는 코드
}
object는 IDisposable 인터페이스를 구현하고자 하는 클래스의 인스턴스이다. IDisposable 인터페이스를 구현하는 모든 클래스는 반드시 Dispose 메소드를 구현해야 한다. Dispose 메소드는 using 블록이 끝나자마자 호출된다.

[메소드]
메소드 한정자
- new : 메소드는 동일한 signature를 갖는 상속받은 메소드를 숨긴다.
- virtual : 메소드는 파생 클래스에 의해 오버라이드 될 수 있다.
- Abstract : 메소드의 signature를 정의하지만 구현은 제공되지 않는 가상 메소드(virtual method)이다.
- Override : 메소드는 상소된 가상 메소드나 추상 메소드(abstract method)를 오버라이드 한다.
- Sealed : 반드시 override와 함께 사용, 이 클래스를 상속받는 클래스에 의해서는 오버라이드될 수 없다.
- Extern : 메소드는 외부에 다른 언어로 구현이 되어 있다.
메소드의 입력인수
기본적으로 인수는 값으로 메소드에 전달된다. (Pass By Value), 하지만 참조변수가 전달되면 참조가 전달되므로 메소드 내부에서 변경시 외부 참조 변수에도 영향이 미친다.
ref 키워드를 이용하여 값 형식 인수를 참조형식으로 전달 가능

Static void somefunc(int[] Ints, ref int i)
{}
//메소드 호출시에도 ref를 붙여주어야 한다.
Somefunc(Ints, ref i);

out : 출력매개변수, C#에서는 변수가 참조되기 전에 반드시 초기화되어야 한다, 메소드의 입력 인수 앞에 out 키워드를 붙이면 초기화하지 않은 값을 메소드로 전달할 수 있다.

형식문자열 (format string)
- C: 현재의 통화 형태
- D: 10진수
- E: 지수적 표현
- F: 부동 소수점 형태
- G: 일반적 형태
- N: 숫자 형태
- P: 퍼센트 형태
- X: 16진수
- #: 어떤문자도 없으면 무시된다.
- 0: 그 자리에 어떤 값이 있으면 그 값에 해당하는 문자로 대치되고, 아무런 값도 없으면 0으로 출력된다.

출처 : http://www.ensimple.net/enSimple/