MSSQL 빨간줄 없애는 단축키


Ctrl+T


아 MSSQL을 쓰다보면 Table 내용이 바뀌면 프로시저 작성할때 자꾸 빨간줄이 뜬당

이게 틀린건아닌데 SSMS가 테이블이 바뀐걸 빠르게 인식을 못해서 빨간줄이 떠지는거같당

뭐 실행시켜보면 빨간줄임에도 불구하고 실행은 잘 된다. 단지 헷갈릴 뿐이지.. 뭐가틀렷지 하고..

그때 Ctrl+T를 눌러주면 빨간줄이 싹 사라진당 ㅎ.ㅎ 연결을 다시하는 느낌인듯


옛날에 찾아놨는데 까먹어서 다시 찾으려다보니 없길래

여러 단축키 눌러보다가 발견해서 적어놓는당



새 테이블을 만들 때 시퀀스는 SERIAL 즉, 다음과 같이 사용하면 됩니다.

1
2
3
CREATE TABLE table_name(
    id SERIAL
);
cs

 SERIAL pseudo-type을 id 컬럼에 할당함으로써 PostgreSQL은 다음을 수행합니다.

1. 순서 오브젝트를 작성해, 순서에 의해 생성된 다음 값으 열을 디플트로 설정합니다.

2. 시퀀스가 항상 null이 아닌 정수를 생성하기 때문에 NOT NULL 제약조건을 열에 추가합니다.

3. 시퀀스의 소유자를 id 열에 할당합니다. 결과적으로 id열 또는 표를 삭제하면 순서 객체가 삭제됩니다.

즉, 위의 소스는 다음과 동일합니다.

1
2
3
4
5
6
7
8
CREATE SEQUENCE table_name_id_seq;
 
CREATE TABLE table_name (
    id integer NOT NULL DEFAULT nextval('table_name_id_seq')
);
 
ALTER SEQUENCE table_name_id_seq
OWNED BY table_name.id;

cs


세부 내용 및 출처 : http://www.postgresqltutorial.com/postgresql-serial/


기존 컬럼에 자동증가 속성 및 pk 추가

ALTER TABLE table_name MODIFY coulmn_name INT NOT NULL AUTO_INCREMENT PRIMARY KEY;


기존 컬럼에 자동증가 속성만 추가

ALTER TABLE table_name MODIFY coulmn_name INT NOT NULL AUTO_INCREMENT;


자동 속성값 초기화

ALTER TABLE table_name AUTO_INCREMENT = 1;


출처 및 추가내용 : http://hammer.tistory.com/entry/MYSQL-%EC%BB%AC%EB%9F%BC-%EC%9E%90%EB%8F%99%EC%A6%9D%EA%B0%80-%EC%86%8D%EC%84%B1-%EB%B3%80%EA%B2%BD-%EB%B0%8F-%EC%B6%94%EA%B0%80-%EC%B4%88%EA%B8%B0%ED%99%94-%EC%BF%BC%EB%A6%AC

다음과 같이 트랜잭션 에러가 나타날 때 에러를 해소할 수 있는 방법입니다.


에러 메시지 : 

미러 데이터베이스 "test"의 트랜잭션 로그 데이터가 부족하여 주 데이터베이스의 로그 백업 체인을 유지...


에러 해소 방법은 주 서버에서 로그를 백업하여 미러서버에서 NORECOVERY로 복원시켜주면 해결됩니다.

로그 백업은 T-SQL로 작업하겠습니다.


먼저 주 서버에서 작업을 진행합니다.


주 서버의 새 쿼리에서 다음과 같이 쿼리를 작성하고 실행합니다.


backup log test to disk = 'c:\test.log' with init

go


test는 데이터베이스 이름입니다.

'c:\test.log'는 로그를 생성할 경로입니다.


저 명령어는 test 데이터베이스를 'c:\test.log' 의 경로에 백업파일을 만들어라 라는 명령어라고 보시면 됩니다.



이렇게 메시지에 위와같은 문구가 뜨고, 쿼리 실행이 정상적으로 수행되었으면 백업파일이 만들어 진 것입니다.

해당 경로에 들어가서 확인해보세요! (어짜피 그 파일 옮겨야해요!)


다음으로 로그 백업 파일을 주 서버에서 미러 서버로 이동시킵니다.

주 서버에서 생성한 백업 파일을 미러서버로 반드시 옮겨줘야 미러서버에서 복원을 진행할 수 있습니다.


그다음은 미러서버에서 작업을 진행합니다.


미러서버의 새 쿼리에서 다음과 같이 쿼리를 작성합니다.


restore log test from disk = 'c:\test.log'

with norecovery, stats

go


test는 데이터베이스 이름입니다.

'c:\test.log'는 주 서버에서 가져온 백업 파일이 있는 미러서버안의 경로입니다.


반드시 'c:\test.log' 경로에 test.log 파일이 미러서버 안에 존재해야 미러서버가 복원할 수 있습니다.

만약 주 서버의 test.log 파일을 D드라이브에 옮겼다면 'c:\test.log'가 아니라 'd:\test.log'로 수정해야겠죠?



위와 같이 쿼리 메시지가 뜨고, 쿼리가 정상적으로 수행되었으면 성공입니다.


복원이 성공되었으면, 다시 미러링을 T-SQL로 연결해봅니다.


>>T-SQL 연결 방법




2.4 미러링 연결 - 파트너 연결


T-SQL의 파트너 연결은 반드시 미러서버에서 먼저 미러링을 연결(T-SQL 실행)한 후 주 서버를 연결해야 합니다.


미러서버에서 먼저 작업을 진행합니다.


미러서버의 새 쿼리에서 다음과 같이 쿼리를 작성한 후 실행합니다. 아래는 예시 쿼리입니다.


alter database test set partner = 'tcp://192.168.10.207:5022'


test는 데이터베이스 이름입니다.

'tcp://192.168.10.207:5022' 는 주서버 ip주소 및 주서버의 미러링 포트번호 입니다.


명령이 완료되었다는 메시지가 뜨면 성공입니다.


다음으로 주 서버에서 작업을 진행합니다.

명령어는 미러서버와 비슷하지만, ip및 포트 부분이 미러서버의 정보로 변경된 명령어입니다.


alter database test set partner = 'tcp://192.168.10.212 : 5022'


test는 데이터베이스 이름입니다.

'tcp://192.168.10.212 : 5022' 는 미러서버의 ip 주소 및 미러서버의 미러링 포트번호 입니다.



미러링이 성공하면 개체 탐색기를 통하여 아래와 같은 결과를 확인할 수 있습니다.


만약, 쿼리 수행 중 트랜잭션 에러가 발생하는 경우에는 다음 미러링 트랜잭션에러편 에서 해당 에러를 해소할 수 있습니다.

>> 트랜잭션 에러편


종종 나타나는 에러긴 한데, 저도 왜 이런 에러가 발생하는지는 아직 파악하지 못했습니다. 아시는분 댓글 부탁드립니다.

저는 어떤 때는 잘 미러링이 되었다가, 어떤 때는 트랜잭션 에러가 발생했습니다.


주 서버의 미러링 성공시 출력 화면입니다.


미러서버의 미러링 성공시 출력 화면입니다.



이제 미러링을 통해 미러서버에 데이터를 쌓은 후, 미러링 옵션을 이용하여 미러링 주체를 바꾸면 미러서버가 주 서버가 되고, 관련 데이터를 확인하시어 미러링테스트를 완료하면 완벽합니다!


이 포스팅을 작성한 이유는, SSMS 2016 버전의 미러링 버그가 있음을 사람들이 잘 인지하지 못하고 있고, 저 역시 버그인줄 몰랐던 터라 해외사이트를 뒤져가면서 삽질아닌 삽질을 계속 하게 되고 운이 좋아 어느 회사의 문서로 T-SQL이 있음을 알게되었고 이렇게 미러링을 완성할 수 있었습니다.


제가 찾아보았던 내용을 정리하여 다른분들께도 도움이 되었으면 하는 바램에 포스팅을 씁니다. 더이상 삽질하지마세요 ㅠ.ㅠ

2. 미러링 구축하기


2.1 데이터베이스 백업


**주서버에서 작업해줘야하는 부분입니다. 예제에서는 192.168.10.207 서버의 데이터베이스에서 이를 진행합니다.


먼저 미러링을 할 데이터베이스를 백업해줍니다.

미러링을 하려는 주 서버의 데이터베이스를 우클릭후, 테스크>백업 버튼을 눌러 백업창으로 들어갈 수 있습니다.



데이터베이스와 백업 유형을 전체로 설정하고, 백업 구성 요소는 데이터베이스로 선택합니다.

그다음 디폴트값으로 설정되어있는 경로를 제거합니다.

제거한 뒤 추가를 눌러 경로를 재설정 해줍니다.




경로를 재 설정해줄 때, 백업 파일을 찾기 쉽게 하도록 경로를 C:\ 로 두었고, 파일명은 "백업파일명.bak" 로 백업파일을 만듭니다.

예시의 경우엔 test.bak 파일로 만들었습니다.


만약, 운영체제 접근 관련 문제가 발생하여 C:\ 의 경로에 백업파일이 생성되지 않는다면, C:\에 폴더를 하나 생성하고 그 폴더 안에 백업파일을 생성하면 문제가 해결될 것입니다.




2.2 데이터베이스 복원


** 이 작업은 미러서버에서 진행합니다. 예시의 경우엔 192.168.10.212 서버에서 진행합니다.


2.1 에서 했던 백업파일을 미러서버에 이동시켜 적용시킵니다.


미러서버의 데이터베이스에서 우 클릭 후 데이터베이스 복원을 클릭합니다.



주 서버에서 생성했던 백업파일을 미러서버에서 적용시켜줍니다.

적용 방법은 아래와 같습니다.


데이터베이스 복원 창에서 일반 > 원본 메뉴의 장치 라디오 버튼 클릭 후 오른쪽에 ... 버튼 클릭


백업 미디어 유형이 파일인지 확인한 후, 오른쪽에 추가 버튼 클릭


주 서버에서 만들어놓은 백업파일을 미러서버로 옮겨온 뒤 (물리적으로 옮겨옵니다.) 그 파일 적용합니다.


만약, 해당 위치에 파일이 없다면, 주 서버에서 미러서버로 백업파일을 옮겨왔는지 확인합니다.

주 서버에서 백업파일을 생성만 하면 미러서버에서 찾을 수 없습니다. 반드시 미러서버로 백업 파일을 옮겨주세요.

USB로 옮기든, 공유 폴더로 옮기든 미러서버로 가져오셔야 합니다.


다음으로, 파일>데이터베이스 파일 복원 메뉴에서

모든 파일을 폴더로 위치 변경 을 체크해주시는걸 권장 드립니다. (자동으로 미러 서버 경로로 변경되는 효과)


모든 파일을 폴더로 위치 변경을 체크하고 싶지 않다면(미러 서버에 특정 위치에 데이터베이스 파일을 놓아야 한다면), 아래 표의 4번째 셀인 "다음으로 복원" 의 경로를 미러서버에 존재하는 폴더로 경로를 변경해줘야 합니다. 경로를 변경하는 방법은 해당 표에서 더블클릭하면 경로를 변경할 수 있습니다.


위와 같은 방법으로 경로를 변경해줘야 하는 이유는 "다음으로 복원" 의 디폴트 위치가 주 서버의 위치로 되어있기 때문입니다. 주 서버에있는 경로를 미러서버에서 읽으려 하니 에러가 날 수 밖에 없기 때문입니다.


경로는 반드시 행 데이터 파일 형식과 로그 파일 형식 둘 다 변경해주어야 합니다. 마찬가지로 하나만 경로를 변경해주면 다른 하나는 주 서버의 경로로 되어있기 때문에 미러 서버가 경로를 찾지 못할 수 있기 때문입니다.


공교롭게도 미러서버와 주 서버의 위치가 같다면 위의 문제는 일어나지 않습니다.


옵션>복원 옵션 에서 

복구 상태는 반드시 RESTORE WITH NORECOVERY로 설정해줍니다.

이 모드가 가장 성능이 좋다고 합니다.


데이터베이스명 (복원 중...) 이라고 뜨는것이 정상이며, 복원중으로 계속 진행되고 있음이 정상입니다. (복원 완료라고 절대 뜨지 않습니다.)

미러서버의 데이터베이스는 복원 중... 이라고 나와야 합니다. 

(나중에 주서버와 미러서버가 변경되었을 경우에도, 주서버가 미러서버가 되었으면 이제 미러서버가 된 구 주 서버의 데이터베이스의 형태는 복원 중 ... 으로 바뀔 것입니다.)


2.3 미러링 연결 - 마법사

* 이 작업은 주 서버에서 진행됩니다.


주 서버의 데이터베이스 우클릭 후, 테스크 > 미러 로 들어갑니다.


미러링에 대해 찾아봤으면 알겠지만, 미러링 모니터 서버를 추가로 구성하려면 위의 예를 누르는게 맞습니다.

하지만 본 예제에선 미러링 모니터를 설정하지 않을 것이기 때문에 아니오로 진행됩니다.


만약, 여러분들 중, 미러링 모니터도 설정해야 한다면, 예를 눌러 미러링 모니터도 설정할 수 있습니다. 미러링 모니터는 연결해보지 않아서 정확하게 말씀드릴 수 없습니다.


주 서버 인스턴스는 미러링을 하기 위해 선택한 데이터베이스 (주 서버) 의 이름으로 적용됩니다. 

저는 IP로 인스턴스 이름을 설정하였지만, 서버 이름이 검색되면 서버 이름으로도 연결이 됨을 확인하였습니다.


포트 및 끝점 이름은 사용자에 의해 변경될 수 있습니다. 만약, 포트가 변경되었으면 "미러링 구축하기 1편의 1.5 방화벽 포트 확인" 및 나중에 연결할 "2.4 미러링 연결 - 파트너 연결" 시 변경된 포트로 적용해야 합니다.



미러서버 인스턴스는 미러링을 연결하기 위해 복원한 데이터베이스(미러 서버)가 있는 서버를 연결해줍니다.

주 서버와 마찬가지로 서버 이름으로 연결했을 시 연결됨을 확인하였습니다.


미러 서버 인스턴스를 보면 <더 찾아보기...>를 클릭하여 연결할 수 있는 창이 뜨고, 연결할 서버의 IP(미러서버) 주소를 입력한 뒤, SA 계정으로 로그인을 수행하면 됩니다.


포트 및 끝점은 사용자에 의해 변경될 수 있습니다.

만약 포트가 변경되었다면 주 서버와 마찬가지로 "미러링 구축하기 1편의 1.5 방화벽 포트 확인" 및 나중에 연결할 "2.4 미러링 연결 - 파트너 연결" 시 변경된 포트로 적용해야 합니다.


SQL Server 2016의 경우에는 미러링 GUI 설정 방법에 문제가 있기 때문에 T-SQL을 이용하여 연결해줘야 합니다..

SQL Server 2012 에서는 미러링 시작 버튼을 눌렀을 때 정상작동을 확인 했습니다. 

본 예제에서는 SQL Server 2016 에서 진행하기 때문에 T-SQL을 이용하여 미러링 연결을 시도합니다.


SQL Server 2016은 버그가 있기 때문에 T-SQL 연결로 시도해야 하는데

그 연결방법은 3편에서 진행됩니다.

MSSQL SQL Server 2016 미러링 구축하기 - 1편


본 포스팅은 SQL Server 2016에 관한 포스팅이 보이지 않아 고초를 겪고 있을 사람들을 위해 정리하였습니다.

SQL Server 2016은 미러링시 약간의 버그가 있음을 확인하였고, 그 버그 부분만 잘 넘겨주시면 기존에 정리되어있는 SQL Server 2012와 동일하게 이용하실 수 있습니다.

버그는 Server 2016은 미러링설정 중, 특정 부분(미러링을시작하는 부분)이 GUI로 해소되지 않음인데 그 부분은 여기에 자세히 나와있습니다.


1. 미러링 환경 및 주의사항


다음 표는 본 예제의 환경입니다.


 

 주 서버

 미러 서버

 OS

 Window Server 2016

 Window Server 2016 

 SQL Server

 SQL Server 2016 

 SQL Server 2016 

 Server Name

 192.168.10.207 

 192.168.10.212 

 Mirroring Port

 5022

 5022

 Sql Port

 1433

 1433 

 Database Name

 test


본 예제의 미러링 연결 모드는 동기화 방식이며 장애조치가 없는 보호 우선 모드로 진행합니다.

또한 본 예제는 서로다른 ip에서 미러링을 하는 것이기 때문에, 미러링 포트는 동일하게 하여도 상관 없습니다.


1.1 SQL Server Version 확인


미러링을 진행하실 때는 주 서버와 미러 서버의 SQL Server가 반드시 동일해야 합니다.

예를 들어, 주 서버가 SQL Server 2016을 사용한다면 미러 서버도 반드시 SQL Server 2016을 사용하여야 합니다.



1.2 동일한 window 계정 존재 확인


주 서버의 Windows 계정에 대한 아이디, 패스워드는 미러서버의 Window 계정에 대한 아이디, 패스워드와 반드시 동일해야 합니다.

▲ 주 서버의 Windows 계정


▲ 미러 서버의 Windows 계정


반드시 계정이 Administrator일 필요는 없으며, test 계정을 만들어 사용해도 상관이 없습니다.

단, 주 서버에 test 계정과 계정의 패스워드가 생성되어야 하고, 미러 서버에도 주 서버와 "동일한" 아이디인 test 계정과 주 서버와 "동일한" 패스워드로 생성 되어야 합니다.


본 예제에서는 Administrator 계정으로 진행될 예정입니다.



1.3 SQL Server의 계정 동일화


SQL Server의 계정은 주 서버와 미러 서버 모두 동일하게 맞춰줘야 합니다.

가급적이면 위에서 "1.2 동일한 window 계정 존재 확인" 에서 맞춰주었던 계정(본 예제에서는 Administrator)을 이용하는 것을 추천합니다.


시작 > SQL Server 2016 구성관리자


▲ 구성 관리자 선택


SQL Server 서비스 > SQL Server (MSSQLSERVER) 우 클릭 > 속성


▲ SQL 속성 선택


찾아보기를 클릭하여 계정 선택


반드시 계정을 선택할 땐 "1.2 동일한 window 계정 존재 확인" 에서 확인했던 동일한 계정으로 설정합니다.

본 예제에서는 Administrator로 선택하였지만, 혹여나 다른 계정으로 만들었으면 그 계정을 선택하여야 합니다.


▲ 계정 선택


▲ 계정 선택


▲ 반드시 "1.2 동일한 window 계정 존재 확인" 에서 확인했던 계정으로 선택!!


▲ 확인을 눌러 계정 선택


다음으로, "1.2 동일한 window 계정 존재 확인" 에서 확인했던 계정과 같은 비밀번호를 입력합니다.


▲ 비밀번호 입력 및 계정 변경 완료


▲ 서비스 재시작


다음과 같이 SQL 계정이 변경되었는지 확인합니다.


▲ SQL 계정 변경 확인


반드시 미러 서버도 확인하여 주 서버와 같이 계정을 동일하게 변경하여 줍니다.


아래의 JYTEST 서버는 이중 서버 테스트이니 본 미러링과는 상관이 없습니다. 신경쓰지마세여~


1.4 SSMS 의 로그인 계정 확인


주 서버와 미러 서버 모두 로그인 계정("1.3 SQL Server 계정 동일화"에서 설정한 계정)이 있는지 확인합니다. (반드시 미러서버도 확인해주세요.)

예제에서는 Administrator로 계정이 설정되어 있습니다.


SSMS에 들어가셔서 보안>로그인 에서 계정이 있는지 확인합니다.




로그인 계정을 확인 했으면 "1.5 방화벽 포트 확인"으로 넘어가시고, 로그인 계정이 없으면 다음과 같은 절차로 계정을 만들어놔야 합니다.


<< SSMS DB Window 인증 계정 만들기 >>


로그인 우 클릭 > 새 로그인



윈도우 인증 선택 후 검색



고급 클릭




지금 찾기 > 해당 계정 선택(예시의 경우 Administrator) > 확인


서버 역할 > sysadmin 체크



상태 > 로그인 사용 체크 > 확인  이 부분 매우 중요!! 사용 안함으로 하면 해당 계정을 사용할 수 없음!



미러서버도 반드시 위와 같이 계정이 있는지 확인한 후, 없다면 계정을 생성하여 활성화 시켜주어야 합니다.


1.5 방화벽 포트 확인


서버관리자 > 도구 > 고급 보안이 포함된 windows 방화벽 클릭



SQLPort(1433) 포트와 Mirroring Port(5022) 및 ping 관련 포트를 인바운드 규칙에 추가시켜줍니다.

위의 포트는 예시 포트이며, 다른 포트를 사용하신다면 사용하시는 포트를 인바운드 규칙에 추가시켜주어야 합니다.

Ping은 윈도우 10의 경우, 보안 규칙으로 인해 막혀있으니 풀어주시길 권장드립니다.
(Ping 이 막혀있어서 미러링이 안됐었던적이 있어서 ㅠㅠ)


아래 그림과 같이 작업을 허용시켜줍니다. 



포트를 추가하는 방법은 다음과 같습니다.


<< 방화벽에 포트 추가하는 방법 >> 


본 예시는 1433 포트를 추가하는 예시로 들 것이니, 5022 포트나 다른 포트 추가 방법은 아래의 방법을 응용하여 추가하십시오.


새 규칙을 클릭하여 새로운 규칙을 만듭니다.



다음 절차에 따라 포트를 추가합니다. 본 예시는 1433 포트를 추가하는 방법입니다. 포트 번호를 바꿔 응용하시면 됩니다.



주 서버와 미러서버 모두 3개의 포트(sql port, mirroring port, ping) 총 6개의 포트를 열어 주어야 합니다.

win10의 경우, ping 포트는 인바운드 규칙에 등록되어 있으니 해당 규칙을 활성화시켜주기만 하면 됩니다.


여기까지 미러링 준비가 완료되었습니다. 위의 조건이 충족되어야만 미러링이 정상적으로 연결되니, 조건을 반드시 확인해주시기 바랍니다.


다음 2편에서는 미러링 구축 본격적으로 해보도록 하겠습니다.

Access 에서 Log4Net을 쓰기 위한 App.config 에 추가해야하는 명령줄


아래 예시는 Access 로 연결하는 방법을 예시로 나타낸 것이며, 각 DB에 따라 연결 방법이 다름을 알립니다. 다른 DB 연결 방법은 아래 출처에 가면 자세하게 나와있으니 참고하시기 바랍니다.


본 예시는 데이터베이스인 mdb에 Log라는 테이블이 존재하고 Log 테이블 안에는 Date, Thread, Level, Logger, Message라는 컬럼이 추가되어 있는 상태.


1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (11) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)
cs



파라미터의 @thread는 Log4Net을 쓸때 개발툴에서 파라미터로 넘겨줄 변수명을 입력하는 것이고, %thread는 데이터베이스로 전달할 (데이터베이스의 컬럼명과 동일함. 데이터베이스는 대소문자 구별하지 않음) 변수를 나타내는 것이다.


아래의 문구를 이용하여 원하는 방법으로 변경하여 이용하자.


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
    <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\log\access.mdb;User Id=;Password=;" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="1024" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
</appender>
<log4net>
cs


출처 : https://logging.apache.org/log4net/release/config-examples.html

Access Db (.mdb) 연결하기 (feat.C#)



1. DB 연결하기

1
2
3
4
5
6
7
// it's your DB file path:
// ApplicationEXEPath\Test.mdb
var DBPath = Application.StartupPath + "\\Test.mdb";
 
conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;"
    + "Data Source=" + DBPath);
conn.Open();
cs


1.1 DB 연결하기 (.accdb파일)

1
2
3
4
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.accdb;"
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
 
cs


2. Insert Query

1
2
3
4
5
6
7
8
// txtInsert.Text:
// INSERT INTO Table_1 (text_col, int_col) VALUES ('Text', 9);
//
// inserts 1 row into Table_1 table
using (OleDbCommand cmd = new OleDbCommand(txtInsert.Text, conn))
{
    cmd.ExecuteNonQuery();
}
cs


3. Select Query

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (DataTable dt = new DataTable())
{
    // txtSelect.Text:
    // SELECT id, text_col, int_col FROM Table_1
    // or
    // SELECT * FROM Table_1
    //
    // selects all content from table and adds it to datatable binded to datagridview
    using (OleDbDataAdapter adapter = new OleDbDataAdapter(txtSelect.Text, conn))
    {
        adapter.Fill(dt);
    }
    dgvSelect.DataSource = dt;
}
cs


4. Update Querty
1
2
3
4
5
6
7
8
// txtUpdate.Text:
// UPDATE Table_1 SET [text_col]='Updated text', [int_col]=2014 WHERE id=2;
//
// changes 2nd row in Table_1
using (OleDbCommand cmd = new OleDbCommand(txtUpdate.Text, conn))
{
    cmd.ExecuteNonQuery();
}
cs

5. Delete Query

1
2
3
4
5
6
7
8
// txtDelete.Text:
// DELETE FROM Table_1 WHERE id=2;
//
// removes 2nd row in Table_1
using (OleDbCommand cmd = new OleDbCommand(txtDelete.Text, conn))
{
    cmd.ExecuteNonQuery();
}
cs


출처 : https://www.codeproject.com/Tips/858771/MS-Access-mdb-plus-Csharp-SELECT-INSERT-DELETE-and

출처 : http://www.csharpstudy.com/Practical/Prac-accessdb.aspx

ACCESS 버전을 확인하려 할때 어떤 버전인지 알고 그에 맞는 프로시저를 사용하거나 ACCESS파일을 사용해야 한다.

나같은 경우는 프로시저를 이용해야 하기 때문에 ACCESS의 파일버전을 알아야 했다.


ACCESS 버전 확인 방법은 확장자명으로 가능하다.


.mdb 의 확장자는 Access 2007이전에 도입된 파일 확장자명 형식이다. 즉, 버전이 Access 2007 이전 버전이라고 생각하면 된다.

.accdb 의 확장자는 Access 2007부터 도입된 파일 확장자명 형식이다. 따라서 버전이 Access 2007 이상의 모든 버전이라고 생각하면 된다.



.accdb 파일형식은 계산된 필드 및 첨부파일과 같은 여러가지 새로운 기능을 지원하지만, accdb에서 사용할 수 없는 .mdb 파일 기능이 있다. 따라서 적합한 access 파일을 사용해야 한다.


아래는 알면 도움이 될것같은 도움말을 발췌해 온 것이다.


--------------MS 발췌-------------

accdb 파일 형식으로 제공되는 기능

  • Access Services를 사용하는 Apps 및 웹 데이터베이스     적절한 서버 리소스가 제공되면 .accdb 파일을 웹에 게시 할 수 있습니다 (특정 호환성 제한이 있음). 앱과 웹 데이터베이스에 액세스하는 두 가지 방법이 있습니다. 

    액세스 앱은 최신 버전의 데이터베이스이며 새로운 버전입니다. 앱은 전적으로 클라우드에서 실행됩니다. 액세스 자체는 앱의 디자인 도구로만 작동합니다. 응용 프로그램은 최신 SQL Server 및 SharePoint 기술을 활용합니다. 웹 데이터베이스는 Access 2010에서 릴리스되었으며 앱과 동일한 이점을 많이 제공하지만 SQL Server는 지원하지 않습니다.

    응용 프로그램이나 웹 데이터베이스를 게시 한 후에는 데이터베이스 자체가 서버에 있습니다. SQL Server 또는 SharePoint의 데이터와 SharePoint의 사용자 인터페이스이지만 데이터베이스를 .accdb 파일로 열어서 디자인을 변경할 수 있습니다. 앱 또는 웹 데이터베이스가 브라우저에서 실행됩니다. 액세스 할 필요도 없습니다.

  • 다중 값 필드     다중 값 필드는 레코드 당 둘 이상의 값을 저장할 수있는 일종의 조회 필드입니다. 예를 들어, 여러 직원에게 작업을 할당해야한다고 가정합니다. .accdb 파일에서 작업에 배정 된 직원을 저장하는 다중 값 필드를 만들 수 있습니다. 직원의 이름은 테이블 또는 값 목록에서 선택할 수 있습니다.

    다중 값 필드를 사용하면 고급 데이터베이스 디자인을 만들 필요없이 하나 이상의 선택 사항을 선택하고 저장하기가 쉽습니다. SharePoint 목록은 다중 값 필드도 지원하므로 다중 값 필드는 SharePoint와의 통합에도 중요합니다.

  • 첨부 파일 데이터 형식     첨부 파일 데이터 형식을 사용하면 모든 형식의 문서 및 이진 파일을 데이터베이스에 쉽게 저장하면서 데이터베이스 파일을 2GB 파일 크기 제한 이하로 유지할 수 있습니다. 즉, 첨부 파일이 자동으로 압축됩니다. 레코드는 여러 개의 첨부 파일을 가질 수 있지만 테이블 당 하나의 첨부 필드 만있을 수 있습니다.

  • SharePoint 및 Outlook과의 향상된 통합     .accdb 파일 형식은 .mdb 파일에서 지원되지 않는 SharePoint 및 Outlook 보안 요구 사항을 지원합니다. 따라서 SharePoint와 Outlook을 Access와보다 완벽하게 통합 할 수 있습니다.

  • 향상된 암호화     데이터베이스 암호를 설정하고 데이터베이스의 내용을 암호화하도록 선택할 수 있습니다. .accdb 파일 형식을 사용하면 기본적으로 Access에서 Windows Crypto API를 사용하여 데이터를 암호화합니다. 타사 암호화 도구를 사용할 수도 있습니다.

.accdb 파일에서 사용할 수없는 .mdb 파일 기능

  • 혼합 버전 환경     .accdb 파일 형식은 Access 2007 이전의 Access 버전을 사용하는 경우에도 열 수 없으며 Access 버전과도 연결되어 있습니다. 조직에 이전 버전의 Access를 사용하는 사람이있는 경우 .mdb 파일이 더 나은 옵션입니다. 그러나 Access가 설치되었는지 여부에 관계없이 웹 브라우저에서 Access 응용 프로그램이나 웹 데이터베이스를 사용할 수 있습니다.

  • 데이터베이스 복제     .accdb 파일에서는 복제를 사용할 수 없습니다. Access 솔루션에서 복제 기능을 사용하는 경우 .accdb 파일 형식을 사용하려면 복제하지 않고 솔루션을 다시 만들어야합니다.

  • 사용자 수준 보안     .accdb 파일 형식은 사용자 수준 보안을 지원하지 않습니다.이 보안 기능은 사람들이보아야하는 내용 만 볼 수있는 방법을 제공합니다. 사용자 보안은 더 이상 데이터 보안에 효과적이지 않습니다. 보안 방법이 현재 쓸모없고 쉽게 손상되어 있기 때문입니다. 그러나 사용자 수준 보안은 사람들이 단순하게 유지함으로써 유용성을 향상시킬 수 있습니다. 예를 들어, 특정 양식을 사용하는 것이 사업상의 이유가없는 경우 양식에서 양식을 숨길 수 있습니다. 가용성을 향상시키기 위해 사용자 수준의 보안을 사용하는 Access 솔루션을 사용하고 있다면 솔루션을 그대로 사용할 수 있도록 .mdb 파일 형식을 계속 사용하고자 할 수 있습니다.

.accdb 파일 형식

Access 2007부터는 .accdb가 기본 Access 파일 형식입니다. .accdb 파일 형식은 계산 된 필드 및 첨부 파일과 같은 여러 가지 새로운 기능을 지원합니다. 그러나 .accdb 파일 형식이 올바른 선택이 아닐 수있는 몇 가지 상황이 있습니다.

.mdb 파일 형식

.accdb 파일 형식이 Office Access 2007에 도입되기 전에 액세스 파일 형식은 .mdb 파일 확장명을 사용했습니다. .mdb 파일 형식에는 여러 버전이 있습니다.

여전히 일부 .mdb 파일을 열 수 있습니다. 파일이 Access 2002-2003 또는 Access 2000 파일 형식으로 저장되어 있으면 파일을 열고 정상적으로 사용할 수 있습니다. 그러나 .accdb 파일 형식이 필요한 기능은 사용할 수 없습니다.

.accdb 파일에서 사용할 수없는 기능을 사용하는 경우에는 파일을 변환하지 말고 .mdb 파일로 남겨 두십시오.



출처 : https://support.office.com/en-us/article/which-access-file-format-should-i-use-012d9ab3-d14c-479e-b617-be66f9070b41

MSSQL CHARACTER_MAXIMUM_LENGTH vs CHARACTER_OCTET_LENGTH


CHARACTER_MAXIMUM_LENGTH : character의 길이(length) 기준

CHARACTER_OCTET_LENGTH : byte의 길이(length) 기준


따라서, var나 varchar는 CHARACTER_MAXIMUM_LENGTH 의 값과 CHARACTER_OCTET_LENGTH의 값이 같다. 

하지만, nvarchar는 유니코드가 포함되어 있는 타입이기 때문에, CHARACTER_MAXIMUM_LENGTH의 값은 CHARACTER_OCTET_LENGTH 값과 다르다. 유니코드는 charater가 1당 byte가 2이기 때문에 CHARACTER_OCTET_LENGTH 의 값이 CHARACTER_MAXIMUM_LENGTH값보다 두 배 차이가 난다.


출처 : https://dba.stackexchange.com/questions/74153/difference-between-character-maximum-length-and-character-octet-length


관련 MSDN : https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/columns-transact-sql

'프로그래밍 > DB' 카테고리의 다른 글

ACCESS SQL 예시 with C#  (0) 2018.04.12
ACCESS 파일 버전 확인하기  (0) 2018.04.10
SQL) MSSQL Query / 기본 쿼리문  (0) 2018.01.12
SQL) MSSQL T-SQL 백업 및 복원  (0) 2018.01.12
윈도우 7에서 SQL Server 2016 설치 불가  (0) 2018.01.04

설명을 돕기 위한 정보


Table명 : test

Table Design :


 Column Name

Type 

Etc.. 

 Number

INT 

PK 

 test

VARCHAR 

 

 Chojing 

VARCHAR 

 


Column명 : Number, test, Chojing

PK : 프라이머리 키

==test테이블==


 Number

test 

Chojing 

 4

 aa

 good

 1

 bb 

 nice 


1. Select 쿼리문


 Select Column명 From Table명


ex1) Select Number From test

결과 : 

 Number

 4

 1


ex2) Select * From test

결과 :

 Number

test 

Chojing 

 4

 aa

 good

 1

 bb 

 nice 



2. Insert 쿼리문


 Insert into 테이블명 (컬럼명1, 컬럼명2, ... ) Values (변경값1, 변경값2, ...)


ex1) Insert into test (Number, test, Chojing) Values (5, cc, great)

결과:

 Number

test 

Chojing 

 4

aa 

good 

 1

bb 

nice 

 5

cc 

great 


*만약 Column의 속성중에서 null 허용이 되어있을 경우 생략 가능하다. 생략하여 Insert 했을 시, 자동으로 null이 삽입된다.

컬럼순서와 변경값 순서는 쌍으로 적용된다. (컬럼명1 에는 변경값1 위치가 적용된다는 이야기)


3. Update 쿼리문


Update 테이블명 Set 컬럼명1=변경값1, 컬럼명2=변경값2 where 조건


ex1) Update test Set test = xx, Chojing = bad where Number='4'

결과:

Number 

test 

Chojing 

xx

bad 

bb 

nice 

5

cc 

great 


4. delete 쿼리문


Delete 테이블명 where 조건


ex1) Delete test where Number='4'

결과:

 Number

test 

Chojing 

 1

 bb

 nice

 5

 cc

great 


*보통 Delete할때 조건은 프라이머리키로 넣는다. 프라이머리키로 안넣으면 에러났던거같은..기억이...

1. 전체 백업 T-SQL


backup database 데이터베이스명 to disk = '경로'

with init

go


경로 예시 ) 'c:\test\testBackup.bak'

반드시 백업파일은 .bak 확장자 명을 이용한다.


2. Log 백업 T-SQL


backup log '데이터베이스명' to disk = '경로'

with init

go


경로 예시 ) 'c:\test\testLogBackup.log'

반드시 로그파일은 .log 확장자 명을 이용한다.


3. 전체 백업 파일 복원 T-SQL


restore database '데이터베이스명' from disk = '경로' ,

with move '데이터베이스명' to '데이터베이스를 위치할 경로',

move '데이터베이스로그명' to '데이터베이스로그를 위치할 경로' 

,recovery , stats


경로 예시 ) 'c:\test\testBackup.bak'

백업파일을 위의 예시에 반드시 옮겨놓고 위의 T-SQL을 진행해야한다. 확인 필수!


4. 로그 백업 복원


restore log 데이터베이스명 from disk = '경로',

with recovery,stats


경로 예시 )  'c:\test\testLogBackup.log'

로그파일을 위의 예시에 반드시 옮겨 놓고 위의 T-SQL을 진행해야한다. 확인 필수!


** 3번과 4번은 테스트 해보지 않았다. 나는 로그 복원을 norecovery로만 해봤기 때문에......

나는 보통 백업 및 복원은 T-SQL로 안하고, GUI의 백업 방법을 이용하여 백업 파일을 떨군다. GUI의 백업 방법중 log 방법은 어떻게 하는지 잘 모르겠어서 T-SQL로 만드는 편이다.

파란색 제목의 작업은 GUI로 하는게 편하다. GUI로 하는걸 추천한다!

GUI포스팅은 좀만 기다려주시면 올려보도록할게요 ㅠㅠ그림포스팅귀차낭...


norecovery는 미러링 하기 전 미러서버에서 복원할 때 norecovery를 썻는데, norecovery 로그 복원은 다음과 같다.


restore log 데이터베이스명 from disk = '경로',

with norecovery, stats





윈도우 7에서 SQL Server 2016을 올리려 할 때 다음과 같이 최소 요구사항을 충족하지 않았다고 이야기한다. 


SQL Server 2016은 윈도우 7을 지원하지 않는다. 윈도우 8 이상부터 지원하기 때문에 OS를 업그레이드 해야 문제가 해결된다. 



출처 : https://stackoverflow.com/questions/38432026/why-can-i-not-install-sql-server-express-2016-on-windows-7-professional-64-bit-s


이 컴퓨터의 운영 체제 또는 서비스 팩 수준이 SQL Server 2016의 최소 요구 사항을 충족하지 않습니다. 이 SQL Server 릴리스를 지원하는 최소 요구사항을 충족하는 운영체제를 확인하려면 다음에서 SQL Server 2016을 설치하는 데 필요한 하드웨어 및 소프트웨어 요구 사항을 참조하세요.

'프로그래밍 > DB' 카테고리의 다른 글

SQL) MSSQL Query / 기본 쿼리문  (0) 2018.01.12
SQL) MSSQL T-SQL 백업 및 복원  (0) 2018.01.12
MSSQL 프로시저 작성방법  (0) 2017.12.13
테이블 명이 바로 쳐지지 않을 때  (0) 2017.09.04
[SQL] SQL문  (0) 2016.01.14

MSSQL 프로시저 작성 방법


1. Select 하는법

기존에 있던 프로시저 중 하나를 가져와 보면 다음과 같다.

"OrgGet"은 프로시저 이름이다.

USE [Unstoring]

GO

/****** Object:  StoredProcedure [dbo].[OrgGet]    Script Date: 2017-12-13 오후 1:49:52 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER PROC [dbo].[OrgGet]

 

AS

 

BEGIN

        SELECT * From organization;

END

 

보통

USE [Unstoring]

GO

/****** Object:  StoredProcedure [dbo].[OrgGet]    Script Date: 2017-12-13 오후 1:49:52 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

까지는 자동으로 써진다. 지금 ALTER 이라고 써져있는 이유는 이미 만들어져있는 프로시저에서 수정하기 를 눌러 쿼리가 생성되어있기 때문에 ALTER라고 씌여져 있는 것이다. 처음 만들 때는 ALTER가 아닌 CREATE 로 만들어야 한다.

그렇기 때문에, 프로시저를 만들려고 하면 다음과 같이 입력하고 실행해야 맞는 이야기다.

USE [Unstoring]

GO

/****** Object:  StoredProcedure [dbo].[OrgGet]    Script Date: 2017-12-13 오후 1:49:52 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROC [dbo].[OrgGet]

 

AS

 

BEGIN

        SELECT * From organization;

END

이렇게 해야 되는데 여기서 바뀐 것은 ALTER에서 CREATE밖에 없다. 이렇게 작성한 뒤, “실행버튼을 누르거나 F5키를 누르면 프로시저가 생성된다. 한번 생성한 프로시저는 지울때까지 사라지지 않는다. 이 프로시저를 수정하는 방법은 위에서 보았듯이 ALTER를 사용하여 수정하면 된다. 이제 프로시저를 개발툴에서 가져다가 쓸 수 있게 되었다. 개발툴에서 쓰는 방법은 좀 뒤에 설명하겠다.


2. Update하는법

USE [Unstoring]

GO

/****** Object:  StoredProcedure [dbo].[ProductAdd]    Script Date: 2017-12-13 오후 2:00:33 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER PROC [dbo].[ProductAdd]

(

        @code                  NVARCHAR(50),

        @name                  NVARCHAR(50),

        @consumer              MONEY,

        @prevailing            MONEY,

        @agency                MONEY,

        @cooperative   MONEY

)

AS

DECLARE

        @MSG    VARCHAR(100)

BEGIN TRY

BEGIN

 

        INSERT INTO product (prdt_code,prdt_name,consumer_price,prevailing_price,agency_price,cooperative_price)

        VALUES (@code,@name,@consumer,@prevailing,@agency,@cooperative);

 

        SET @MSG = 'Product_Input_Success';

END

END TRY

BEGIN CATCH

BEGIN

        SET @MSG = 'Product_Input_Fail';

END

END CATCH

 

SELECT @MSG AS MSG;

 

ProductAdd는 프로시저 이름이다.


@변수를 하게되면 개발툴에서 넘겨주는 파라미터를 이용하여 값을 가져와 쓸 수 있다. 반드시 개발툴에서 넘겨지는 파라미터와 @변수 개수가 똑같아야 하며 타입도 똑같아야 한다. 순서는 반드시 똑같게 할 필요는 없다. 하지만 파라미터와 @변수는 파라미터 = 변수 로 같아야 한다. , @변수를 선언하게 되면 반드시 개발툴에서 파라미터를 만들어 입력을 꼭 해줘야 한다. 그러니까 예를 들면, @변수가 @test 였다고 하면, 개발툴에서의 파라미터 이름은 반드시 test로 해야 프로시저가 알아듣는다는 이야기이다.


Declare는 내가 프로시저 안에서 쓸 변수 같은 지역변수 같은 느낌으로 보면 된다. 개발툴에서는 접근할 수 없는 변수이고 또 접근할 필요가 없는 변수이면 Declare를 쓰는 게 낫다. 무작정 @변수로 만들어버리면 개발툴에서 반드시 파라미터로 값을 입력해줘야하는 번거로움이 생기기 때문이다. 나 같은 경우는 @MSG 라는 Declare 변수를 만들어서 INSERT가 정상적으로 처리가 되었는지 확인하는 용도로 썼다.


BEGIN TRY / END TRY Try/Catch 문이라고 이해하면 쉽다. BEGIN TRY 문 안에서 에러가 났으면 중지하고 BEGIN CATCH문으로 들어가게 된다. 보통 정상적으로 프로시저가 실행이 되었는지 확인하는 용도로 쓴다고 생각하면 된다.


BEGIN / END 는 그냥 단순히 BEGIN { , END} 라고 생각하면 된다고 구글신이 그랬다.

 

3. 개발툴에서 Select 하는 법

string strCon = "server = " + serverIP + "," + serverPort + "; uid =id; pwd = password!; database = dbname; Connection Timeout = 5"; //MSSQL 연결하기 위한 작업

string m_sqlCon = new SqlConnection(strCon); // 명령어 생성

SqlCommand scom = new SqlCommand("OrgGet", m_sqlCon); // "OrgGet"은 프로시저 이름이다. 프로시저 명령어 생성부분

if (m_sqlCon.State == ConnectionState.Closed) //DB가 닫혀있다면 열기

           m_sqlCon.Open();

scom.CommandType = CommandType.StoredProcedure; //프로시저 타입 지정

if (_param != null) // 파라미터가 있을 때 파라미터 값들 추가하는 부분

           scom.Parameters.AddRange(_param); // Select는 파라미터 추가가 없으니 건너뛰게됌

DataSet dataset = new DataSet();//데이터셋 생성

using (SqlDataAdapter da = new SqlDataAdapter(scom)) // 어댑터를 이용하여 데이터 받아오기

{

           da.Fill(dataset); // 데이터 채우기 dataset에 정보가 담겨져있음.

}

m_sqlCon.Close(); //디비 닫기

 

4. 개발툴에서 Update 하기

string strCon = "server = " + serverIP + "," + serverPort + "; uid = id; pwd = password; database = dbname; Connection Timeout = 5"; //MSSQL 연결하기 위한 작업

string m_sqlCon = new SqlConnection(strCon); // 명령어 생성

SqlCommand scom = new SqlCommand("ProductAdd", m_sqlCon); //프로시저 생성. 이름 주의해서 써야함. 파라미터는(이름,연결명령어)

var _param = new[]{ //파라미터 생성

           new SqlParameter {

                     ParameterName = "@code", //위의 @변수 이름 그대로 생성

                     Direction = ParameterDirection.Input,

                     Value = info.strPrdtCode //Value타입은 위의 프로시저 그대로 입력해야함.

                                                     //예를들면 int는 반드시 int타입으로 입력

           },

           new SqlParameter {

                     ParameterName = "@name",

                     Direction = ParameterDirection.Input,

                     Value = info.strPrdtName

           },

           new SqlParameter {

                     ParameterName = "@consumer",

                     Direction = ParameterDirection.Input,

                     Value = info.strConsumerPrice

           },

           new SqlParameter {

                     ParameterName = "@prevailing",

                     Direction = ParameterDirection.Input,

                     Value = info.strPrevailingPrice

           },

           new SqlParameter {

                     ParameterName = "@agency",

                     Direction = ParameterDirection.Input,

                     Value = info.strAgencyPrice

           },

           new SqlParameter {

                     ParameterName = "@cooperative",

                     Direction = ParameterDirection.Input,

                     Value = info.strCooperativePrice

           }

}; //@변수를 하나라도 빼뜨리고 파라미터로 넘겨주면 안됨. 변수 있는거 모두 값을 지정하여 넘겨줘야함

if (m_sqlCon.State == ConnectionState.Closed)

           m_sqlCon.Open();

 

scom.CommandType = CommandType.StoredProcedure;

 

if (_param != null)

           scom.Parameters.AddRange(_param);

 

DataSet dataset = new DataSet();

string str = "";

using (SqlDataAdapter da = new SqlDataAdapter(scom))

{

           da.Fill(dataset);

           str = dataset.Tables[0].Rows[0].ItemArray[0].ToString(); 

//@MSG를 보기위해 만든 것. 성공인지 실패인지 가리기 위해 가져온 부분. 테이블이 Select1개밖에 실행되지 않으니 TableRows0번째일것이다. 그리고 쭈루룩 들어오는 아이템들은 ItemArray로 들어오게 된다. MSG는 하나의 줄만 들어올 테니 ItemArray에는 0번째 아이템이 들어오겠지 그게 Success 인지 Fail인지 들어오게 되니 그걸 확인하기 위하여 위와 같은 dataset.Tables[0].Rows[0].ItemArray[0].ToString();를 사용하여 확인하는 것이다.

}

m_sqlCon.Close();

 

이거에서 응용하면 된다!

'프로그래밍 > DB' 카테고리의 다른 글

SQL) MSSQL Query / 기본 쿼리문  (0) 2018.01.12
SQL) MSSQL T-SQL 백업 및 복원  (0) 2018.01.12
윈도우 7에서 SQL Server 2016 설치 불가  (0) 2018.01.04
테이블 명이 바로 쳐지지 않을 때  (0) 2017.09.04
[SQL] SQL문  (0) 2016.01.14

USE chyDB

go 

EXEC sp_changedbowner 'cjy'

go

////////////////////////////////////////////////////////

USE 데이터베이스명

go

EXEC sp_changedbowner '사용자명'

go

///////////////////////////////////////////////////////

출처는..까먹음

'프로그래밍 > DB' 카테고리의 다른 글

SQL) MSSQL Query / 기본 쿼리문  (0) 2018.01.12
SQL) MSSQL T-SQL 백업 및 복원  (0) 2018.01.12
윈도우 7에서 SQL Server 2016 설치 불가  (0) 2018.01.04
MSSQL 프로시저 작성방법  (0) 2017.12.13
[SQL] SQL문  (0) 2016.01.14

옛날 프로젝트 했던걸 기반으로 예시 SQL문 짱박아놓기

 

//선배가 준 예시본
--관리자 추가
INSERT INTO MANAGER VALUES('manager', '000');


--엘레베이터 정보 추가
INSERT INTO ELEVATOR_INFO VALUES('00A', 800, 6);
INSERT INTO ELEVATOR_INFO VALUES('00B', 900, 8);
INSERT INTO ELEVATOR_INFO VALUES('00C', 1000, 7);

--엘레베이터 추가
INSERT INTO ELEVATOR VALUES('00a', '00A', '000');
INSERT INTO ELEVATOR VALUES('00b', '00B', '001');
INSERT INTO ELEVATOR VALUES('00c', '00C', '002');

--이력 추가
INSERT INTO HISTORY VALUES('00_0a', '00a', SYSDATE);
INSERT INTO HISTORY VALUES('00_0b', '00b', SYSDATE);
INSERT INTO HISTORY VALUES('00_0c', '00c', SYSDATE);

--점검 이력 추가
INSERT INTO CHECK_HISTORY VALUES('00_0a', '이상 없음');
INSERT INTO CHECK_HISTORY VALUES('00_0c', '이상 없음');

--고장 이력 추가
INSERT INTO FAILURE_HISTORY VALUES('00_0a', '하중 센서 이상');
INSERT INTO FAILURE_HISTORY VALUES('00_0b', '속도 이상');
INSERT INTO FAILURE_HISTORY VALUES('00_0c', '문 이상');

--수리 이력 추가
INSERT INTO REPAIR_HISTORY VALUES('00_0a', '하중 센서 수리');
INSERT INTO REPAIR_HISTORY VALUES('00_0b', '속도 센서 교체');
INSERT INTO REPAIR_HISTORY VALUES('00_0c', '문 수리');

------------------------------------------------------------------------------
알아간것들

// INSERT INTO 클래스명 VALUES ('자료','자료');


//컬럼 삭제
ALTER TABLE APT  //ALTER TABLE 테이블 이름
DROP COLUMN APT_floor;  // DROP COLUMN 컬럼이름;

//컬럼 타입 변경
ALTER TABLE APT  //ALTER TABLE 테이블이름
MODIFY(APT_floor INTEGER); //MODIFY(컬럼이름 타입);

//컬럼추가
ALTER TABLE HISTORY //ALTER TABLE 테이블이름
ADD(APT_floor INTEGER); //ADD(컬럼이름 타입);


//날짜(DATE) 추가
//TO_DATE(숫자 , YYYYMMDD)
//만약 안에 하이픈이라던가 띄어쓰기 있으면 문장형으로 숫자가 아닌 '숫자-숫자'등으로 쓴다
TO_DATE(20140101,'YYYYMMDD')
TO_DATE('2014-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')

//DATE 가져올때

SELET TO_CHAR (HISTORY, 'YYYY-MM-DD HH24:MI:SS)


//SQL 문 Join

select 열 목록 (칼럼) from 첫 번째 테이블 INNER JOIN 두 번째 테이블 ON 조인될 조건 where 검색 조건

select history_date,check_contents from history h inner join check_history c on h.HISTORY_CODE=c.HISTORY_CODE where
elevator_code = 'E1_01'

//원하는 데이터 수정할때 (update)

update 테이블 명 set 새 데이터명 = ' ' where 바꿀 데이터명 = ' '

update telephone_dic set phone = '010-1534-5668' where phone = '010-1234-1234'

//원하는 데이터 삭제할때 (delete)

delete from 테이블명 where 지우고자하는데이터명 = ' '

delete from telephone_dic where phone = '"+textBox1.Text+"'
---------------------------------------------------------------------------------
데이터 저장용(관리자는 없음)

--APT

INSERT INTO APT VALUES('A1',1);
INSERT INTO APT VALUES('A2',2);

--HOUSEHOLD

INSERT INTO HOUSEHOLD VALUES('F1_101',101,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_102',102,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_103',103,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_104',104,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_105',105,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_106',106,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_107',107,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_108',108,'A1');
INSERT INTO HOUSEHOLD VALUES('F2_101',101,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_102',102,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_103',103,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_104',104,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_105',105,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_106',106,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_107',107,'A2');
INSERT INTO HOUSEHOLD VALUES('F2_108',108,'A2');

INSERT INTO HOUSEHOLD VALUES('F1_201',201,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_202',202,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_203',203,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_204',204,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_205',205,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_206',206,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_207',207,'A1');
INSERT INTO HOUSEHOLD VALUES('F1_208',208,'A1');

 

--Telephone_Dic

INSERT INTO TELEPHONE_DIC VALUES('010-0001-0101','F1_101');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0102','F1_102');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0103','F1_103');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0104','F1_104');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0105','F1_105');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0106','F1_106');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0107','F1_107');
INSERT INTO TELEPHONE_DIC VALUES('010-0001-0108','F1_108');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0101','F2_101');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0102','F2_102');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0103','F2_103');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0104','F2_104');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0105','F2_105');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0106','F2_106');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0107','F2_107');
INSERT INTO TELEPHONE_DIC VALUES('010-0002-0108','F2_108');


--ELEVATOR_INFO

INSERT INTO ELEVATOR_INFO VALUES('1',1010,10);
INSERT INTO ELEVATOR_INFO VALUES('2',1020,20);
INSERT INTO ELEVATOR_INFO VALUES('3',1030,30);
INSERT INTO ELEVATOR_INFO VALUES('4',1040,40);

--Elevator

INSERT INTO ELEVATOR VALUES('E1_01','1','A1');
INSERT INTO ELEVATOR VALUES('E1_02','2','A1');
INSERT INTO ELEVATOR VALUES('E1_03','3','A1');
INSERT INTO ELEVATOR VALUES('E1_04','4','A1');
INSERT INTO ELEVATOR VALUES('E2_01','1','A2');
INSERT INTO ELEVATOR VALUES('E2_02','2','A2');
INSERT INTO ELEVATOR VALUES('E2_03','3','A2');
INSERT INTO ELEVATOR VALUES('E2_04','4','A2');

--HISTORY

INSERT INTO HISTORY VALUES('H001','E1_01',TO_DATE('2014-11-20 09:52:17','YYYY-MM-DD HH24:MI:SS'),2);

--CHECK_HISTORY

INSERT INTO CHECK_HISTORY VALUES('H001','점검 완료');

--REPAIR_HISTORY

INSERT INTO REPAIR_HISTORY VALUES('H001','수리하였음');

--FAILURE_HISTORY

INSERT INTO FAILURE_HISTORY VALUES('H001','고장났음');

--CALL_HISTORY

INSERT INTO CALL_HISTORY VALUES('H001',TO_DATE('2014-11-20 10:06:26','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-11-20 10:07:06','YYYY-MM-DD HH24:MI:SS'));


 

 

+ Recent posts