.NET ] 멀티 랭귀지 지원 ...
멀티 랭귀지 지원에 대해 글을 한번 싸질러본다.
몇가지 글을 찾아보았는데... 영문에 장수도 만만치 않다.
따라해도 뭐가 빠졌는지 잘 안된다...
따라하기를 포기하고 그냥 내방식대로 코드 노가다와 감으로 짜보니 되더라...
1. 새 프로젝트를 생성한다. ( 응용프로그램 : Form )
2. 프로젝트내에 기본으로 있는 Resources.resx 에 [이름)Name / 값)Name] 을 추가해준다. ( 영문명 )
3. 새 항목 추가로 리소스를 추가한다. 이때 이름은 Resources.ko-kr.resx 이다. ( 한글명 )
동일한 Key로 써야 하니까 [이름)Name / 값) 이름] 이라고 추가한다.
4. 폼에 버튼 하나를 놓아둔다.
5. Form 소스에서 버튼.Text 에 Name을 할당해보자.
---- 소스 --------------------------------------------------------------------------------------
button1.Text = Demo_MultiLanguage.Properties.Resources.Name;
요렇게.... 넣으면 기본 리소스 이용으로 영문으로 "Name" 이 나온다.
Name으로 나오게 된다.
한글로 안나오는 이유를 보면..
Demo_MultiLanguage.Properties.Resources.Culture 요 값이 null 값으로
null이면 기본 리소스 값을 가져오는 듯 하다.
6. 이제 한글이 되도록 바꿔보자.
---- 소스 --------------------------------------------------------------------------------------
Demo_MultiLanguage.Properties.Resources.Culture = new System.Globalization.CultureInfo("ko-kr");
button1.Text = Demo_MultiLanguage.Properties.Resources.Name;
요러면... 버튼에 "이름" 이라고 표시된다.
## 중요 참고 사항 ###############################################################################
1. 새로 만든 리소스 파일명에 주의 한다.
Resources.resx
Resources.ko-kr.resx
2. 파일 위치를 잘 맞춘다.
끝!!!
--- 추가 내용 (잘못된 정보다)----------------------------------
{ // 또 실수할까봐... 남겨둔다.
all in one code framework 의 샘플들을 훑어보던 중 쇼킹..
Form아래 resx파일을 추가해두고
해당 resx에서 [이름)컨트롤명.프로퍼티 / 값) 값] 요거 하나로 끝나는걸 봤다.
코드를 넣을필요도 없네??? 멋지다.
}
>> 잘못된 정보다!!! 위!!
잘못된 정보대로 하니 안된다... 저걸로 하는게 아니고
의외로 간단하게 된다.
Form에 localizable 프로퍼티를 디자이너 에서 true 시켜놓고 디자인 작업을 하면
자동으로 생성이 되네? -> resx에...
다음 그냥 디자이너에서 속성창에서 Text수정하면 자동으로 resx를 만들어 저장한다.
정리하면
그냥 로컬라이즈 = true 걸어놓고
언어 선택 후
디자이너에서 컨트롤 프로퍼티를 조정하면 알아서 저장된다 ㅡ.,ㅡ;;
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
2010 WinForm ] 컨트롤 리사이징 예제... (0) | 2012.07.20 |
---|---|
.Net] 버튼 Pressed Event!! (0) | 2012.05.09 |
ArrayList.Sort 하기... (4) | 2011.07.29 |
[IPC] Event 추가 ~~ (0) | 2011.05.14 |
LINQ] 로또 구하기? (1) | 2011.04.25 |
MS-SQL] SP_JS_시리즈...
이번 프로젝트에서 개량된 도우미 sp시리즈임.
SP 내용은 공개하지 않음!!!( 누구나 만들 수 있는 쿼리이기에... )
단축키로 등록해서 사용하면 매우 편리하다.
- SP_JS_OBJECT_EXTENDEDPROPERTY 는 객체의 확장속성등을 정의하는 쿼리와 적용된 내용을 보여준다.
- SP_JS_OBJECT_INFO 는 SP_HELP와 같다 다만 SP를 만들때 사용할 파라미터라든가 설명등을 같이 보여준다.
기본 정보(객체정보), 컬럼 ( TABLE ), 파라미터( SP, FUNCTION ), RETURN TABLE( FUNCTION ), 객체종속정보
<< FUNCTION 상세보기 >>
<< PROCEDURE 상세보기 >>
- SP_JS_CHANGECOLLATE 은 테이블의 컬럼에 데이타 정렬 속성을 변경할 수 있는 쿼리를 보여준다.
결과1 : ALTER TABLE ORDERING ALTER COLUMN CD varchar(20) COLLATE Korean_Wansung_BIN
결과2 : ALTER TABLE ORDERING ALTER COLUMN CD varchar(20) COLLATE Korean_Wansung_CI_AS
컬럼이 한두개일땐 모르지만 엄청 많을때 이거 엄청 고된 작업이 된다... 그때 사용하면 된다.
이 SP 들과 연계되는 각종 도우미 프로그램들도 있다...
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
MS-SQL] sp_helptxt 만들기... (0) | 2012.11.22 |
---|---|
MS-SQL] 테이블 스키마 생성 추출 쿼리. (0) | 2012.11.21 |
MS-SQL ] MSDN 일부 정리! (0) | 2012.03.02 |
MS-SQL ] 1:N 관계에서 n순번 따기... (0) | 2012.03.02 |
[MS-SQL] 음... 잡다? (0) | 2012.01.02 |
MS-SQL ] MSDN 일부 정리!
작업하면서 틈틈히 정리하려고 했던 내용인데
많이는 못하고 일부만 올린다.
#####################################################################################################
## 실행계획 관련해서 찾아본 링크 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
URL : http://rdbms.tistory.com/entry/Order-By-Tuning
DISTINCT : 전체 스캔을 하여 중복된 로우를 제거 한다.
ORDER BY : 전체 스캔을 하여 해당 엑세스가 된 로우를 정렬을 한다.
결국 둘다 전체 스캔을 유도 하는 구문입니다.
** 무슨 수를 써던 Order By를 사용하지 않던가 Order By 대상건수를 줄이는 것이 최대 관건이다.
현실적으로 업무상 Order By를 사용하지 않을수는 없을 것이므로 **
/*실행계획 ###############################################################*/
--[Bookmark Lookup] 연산자는 책갈피(행 ID 또는 클러스터링 키)를 사용하여 테이블이나 클러스터형 인덱스에서 해당 행을 조회합니다
--[RID Lookup]은 제공된 RID(행 식별자)를 사용하여 힙을 조회하는 책갈피 조회입니다.
-- => RID Lookup은 항상 NESTED LOOP JOIN과 함께 사용됩니다. RID Lookup은 물리 연산자입니다.
-- RID Lookup은 Heap Table에서 만 일어난다.(Unique Non-Clustered)
--[Key Lookup] 연산자는 클러스터형 인덱스가 있는 테이블의 책갈피 조회입니다.
-- => Key Lookup은 항상 Nested Loops 연산자와 함께 사용됩니다.
/*[#Tip]
글러스터드 인덱스는 리프레벨에 모든 데이터를 가지고 있기 때문에 같은 컬럼에 넌클러스트를 만드는 경우보다 더 커지게 됩니다 ^^ 룩업이 발생하지 않는다면 같은 컬럼의 클러스터드 보다 넌클러스트 인덱스가 i/o를 좀더 줄일 수도 있습니다 */
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
#####################################################################################################
/*시간 ###############################################################*/
SELECT Current_Timestamp , GETDATE()
SELECT @@DATEFIRST -- 7 : 일요일임을 뜻함
-- 현재 WEEKDAY 는 요일, WEEK는 주 곧. '2012-07-02' 는 월요일이고, 27번째주가 된다.
SELECT DATEPART( WEEKDAY, '2012-07-02' ), DATEPART( WEEK, '2012-07-02' )
-- DATEPART ? 로 검색되네?
-- http://msdn.microsoft.com/ko-kr/library/ms174420.aspx
SELECT Current_Timestamp
, Datename(YYYY, Current_Timestamp ) -- YEAR : YY, YYYY
, Datename(MM, Current_Timestamp ) -- MONTH : MM, M
, Datename(DD, Current_Timestamp ) -- DAY : DD, D
, Datename(HH, Current_Timestamp ) -- HOUR : HH
, Datename(N, Current_Timestamp ) -- MINUTE : MI,N
, Datename(S, Current_Timestamp ) -- SECOND : SS,S
, Datename(MS, Current_Timestamp ) -- MILLISECOND : MS
, DATEPART(YYYY, Current_Timestamp ) AS [DATEPART] -- DATEPART로 해봄.
-- ISDATE는 CONVERT 함수와 함께 사용하고 CONVERT 스타일 매개 변수가 지정되고
-- 스타일이 0, 100, 9 또는 109가 아닌 경우에만 결정적입니다.
-- http://msdn.microsoft.com/ko-kr/library/ms187347.aspx
select ISDATE( '20120110130200'), ISDATE( '2012-01-10 13:02:00') -- 시간포멧 확인
--지정된 startdate와 enddate 간에 겹쳐지는 지정된 datepart 범위의 수(부호 있는 정수)를 반환합니다.
--http://msdn.microsoft.com/ko-kr/library/ms189794.aspx
--두 시각의 START - END = RESULT
--DATEPART( YEAR, MONTH, DAY, HOUR, MINUTE, SECOND )값에 따라 체크(분단위까지 유효!)됨.
SELECT DATEDIFF( DAY , '2012-01-11 13:01:00', Current_Timestamp )
/*시간 ###############################################################*/
/* 구성함수 ##########################################################*/
-- 요청이 들어 오는 고유한 연결의 연결 속성에 대한 정보를 반환합니다
-- http://msdn.microsoft.com/ko-kr/library/bb895240.aspx
select ConnectionProperty('local_net_address') , ConnectionProperty('local_tcp_port')
--현재 사용 중인 언어의 이름을 반환합니다.
select @@Language
--현재 서버에 설정되어 있는 decimal과 numeric 데이터 형식의 전체 자릿수 수준을 반환합니다.
select @@Max_Precision
-- 저장 프로시저가 다른 저장 프로시저를 호출하거나 CLR(공용 언어 런타임) 루틴, 유형
-- 또는 집계를 참조하여 관리 코드를 실행할 때마다 중첩 수준이 증가합니다.
-- 최대값 32를 초과하면 트랜잭션이 종료됩니다.
select @@Nestlevel
-- 서버명
select @@Servername
-- 서버sql버젼
select @@Version
-- 서비스 명
select @@Servicename
-- text 사이즈
select @@Textsize
/* 구성함수 ##########################################################*/
/*메타데이터 함수 ###################################################*/
Col_Length()
Col_Name()
Columnproperty()
Db_Id()
Db_Name()
Index_Col()
Indexkey_Property()
Indexproperty()
Typeproperty()
Object_Id()
Object_Name()
Objectproperty()
Objectpropertyex()
Sql_Variant_Property()
/*메타데이터 함수 ###################################################*/
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
MS-SQL] 테이블 스키마 생성 추출 쿼리. (0) | 2012.11.21 |
---|---|
MS-SQL] SP_JS_시리즈... (0) | 2012.03.02 |
MS-SQL ] 1:N 관계에서 n순번 따기... (0) | 2012.03.02 |
[MS-SQL] 음... 잡다? (0) | 2012.01.02 |
MS-SQL ] default (0) | 2011.11.18 |
MS-SQL ] 1:N 관계에서 n순번 따기...
이번 프로젝트에서 업체와 관련된 테이블 쿼리에서 업체에 등록된 면허들에 대한 정보를 피벗해서 한번에 보여줘야 하는
쿼리를 처리하면서 잔머리 써본 쿼리 중 짧은 예로 작성해본다.
/*KEY [ tb_1 ( 1 : N ) tb_n ]#################################################################*/
SELECT *
FROM (
values
('a', 'Nm:a')
, ('b', 'Nm:b')
, ('c', 'Nm:c')
, ('d', 'Nm:d')
, ('e', 'Nm:e')
) as tb_1( K, N )
SELECT *
FROM (
values
('a', 'm1:a1')
, ('a', 'm2:a2')
, ('b', 'm1:b1')
, ('e', 'm1:e1')
, ('e', 'm2:e2')
) as tb_n( K, N )
/*순번 따기 ##################################################################################*/
SELECT
tb_1.K
, tb_1.N
, ROW_NUMBER() OVER ( ORDER BY tb_1.K ) - RANK() OVER ( ORDER BY tb_1.K ) + 1 [SN_SEQ]
, tb_n.N
FROM (
values
('a', 'Nm:a')
, ('b', 'Nm:b')
, ('c', 'Nm:c')
, ('d', 'Nm:d')
, ('e', 'Nm:e')
) as tb_1( K, N )
LEFT OUTER JOIN
(
values
('a', 'm1:a1')
, ('a', 'm2:a2')
, ('b', 'm1:b1')
, ('e', 'm1:e1')
, ('e', 'm2:e2')
) as tb_n( K, N )
ON tb_1.K = tb_n.K
결과 ---
보면 a에 대해 1, 2 순번을 따 놓은게 보인다.
이를 이용해 그룹바이를 통해 CASE로 골라내면 옆으로 늘어뜨리는게 가능하다.
다만 CASE로 처리할수 있는 부분이 코드에 따라 달라지므로 이걸 동적으로 처리할 수 있다면 좋겠지만...
우선은 제한적으로 5개, 10개 등으로 제한된 갯수를 표현하는데 무리없는 쿼리라고 보면 된다.
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
MS-SQL] SP_JS_시리즈... (0) | 2012.03.02 |
---|---|
MS-SQL ] MSDN 일부 정리! (0) | 2012.03.02 |
[MS-SQL] 음... 잡다? (0) | 2012.01.02 |
MS-SQL ] default (0) | 2011.11.18 |
MS-SQL ] 오류 메세지 정리 (0) | 2011.11.17 |
ERP 개발이 드디어 2월 29일 종료되었다.
지금은 휴식 중인데... 이거 참... 왠지 쓸쓸하네...
쉬면서도 프로그램 3개를 모델링하고 있는 난 뭐하는건가 하고 허무하게 모니터만 보고 멍때리게 되네...
아무튼 7개월 개발 기간이 종료되고 남은건 후회 뿐이네...
아쉬운 부분은...
1. 만들다 접은 CodeGenVer4 .
2. 통테가 되서야 알게된 업무 흐름...
그나마 건진건 프로세스에 맞춘 나만의 문서정리방법( 앞으로의 프로젝트에서 좀더 가다듬어야 겠다. )
아쉬운점 첫번째는 만들다 접은 CodeGenVer4는 기본틀과 컨셉은 잘 잡았는데 굿센용으로 변경하면서 완전 꼬였다.
코드파인드, 그리드 관련 메서드처리등... ( 소스에서 똑같은 소스 붙여넣기가 너무 많다. 불필요하게 느껴지는 작업 공수랄까?? )
변환 흐름은 대략 이렇다.
1. 사용될 Select문의 결과 필드 -> 모두 객체화
2. 해당 객체들에 대해 UI상 필요한 컨트롤들로 맵핑처리
3. 해당 객체들에 대해 insert, update, delete 의 파라미터로 맵핑처리.
4. UI상에서의 맵핑된 컨트롤 위치 셋팅 ( 그리드 제작됨 )
5. 소스 제너레이터를 이용한 소스 생성
6. 폴더+파일들로 프로젝트 구성후 특정 폴더로 복사! 완료처리.
이거 만들면서 WPF 에 그리드 를 담당할 녀석을 만들었는데 레이아웃용으로 너무 좋다.
두번째로 통테에 와서야 업무 프로세스대로 데이타를 넣고 결과를 보는 작업을 어깨너머로 봤다.
초반 한달 반정도는 뭐가 어떻게 되는지도 감도 못잡고 그랬다... 뭘 해야 되는지도 모르고 기다리기만....
통테 본 이후에서야 겨우 데이타 확인하는 눈이 생겼다랄까??? 답답함이 완전 스트레스....
나의 프로그래머의 등급은 초급 ... 급여도 그에 맞춰져 있고...
요구사항들은 왠지 모르게 그 이상의 것들이라고 보이는건 내가 아직도 멀은건가...
몇일간 모델링중인 프로그램은
첫번째 새로 일하게 될 관제시스템 모델링( 기존것과 다른 새로운 개념으로... )
두번째 일정관리 프로그램 ( 이번 프로젝트에서 문서화 하는데 있어서 기존 일정 프로그램으론 부족한게 많아서 업그레이드, 사실 이전에 한번 업글을 한게 있는데 ui가 참 볼상 사나워서 소스채로 있고 활용은 안하고 있음. )
세번째 슬레이트에 올라갈 관리프로그램으로 CodeGenVer4에서 만든 그리드를 이용한 윈8처럼 매트로 ui를 만들어서 기존 플러그인 모듈을 탑재하고 파일 관리매니져를 탑재시켜 새로운 일정 관리 및 프로젝트 관리 프로그램, 프로그램관리등....
( 이건 올해 내내 만들면 가능할듯 하다. )
그외 아이디어들은 수첩에 있긴한데 아직 감이 확 오는게 없다.
관제프로그램을 다시 맡게된 이유는 .. 왠지 내가 만든 프로그램이 완성해놓지 않고 버리고 가는 느낌이 들어서
만들어놓고 가기 위해 맡았다.
아 언제쯤 돈을 많이 벌수 있을까낭... 이제 닷넷을 내려놓고 자바로 갈아타야 되려나...
닷넷이 정말 편하고 빠른데...
'--- 취미 > 생각하기' 카테고리의 다른 글
IQ테스트? (0) | 2012.11.05 |
---|---|
흠.. 덥다... (0) | 2012.07.29 |
계약? ... 왠지 모르게 찜찜해... (0) | 2011.08.08 |
7월 28일 목포의 하늘 (0) | 2011.07.29 |
책 4권 구입... (0) | 2011.07.22 |
Commad? 응용...
오늘 작업중에 ERP에서 그룹웨어 전자결재관련 링크 콜! 하는 부분에 대한 작업을 하였음.
프레임웍 쪽은 내가 관여할 부분이 안되므로... 단순한 코딩보다
그룹웨어 관련 명령을 관리할수 있는 걸 만들어두면 추후 좋지 않을까 해서 ...
작업을 시작하였음. 코드는 기록 못하니... 패턴 형태만 기록함.
우선 Event에 대한 동작은 기능에서 제외했다.( 객체사용에 있어서 이벤트까지 필요없는 것임. )
구현에 있어 떠오른 패턴은 커맨드패턴이다. 약간의 변형을 시켜 만들어 보았다.
#그룹웨어 관련 데이타 인터페이스
_. 멤버1
_. 멤버2
_. 멤버...
_. 멤버 유효성체크();
#그룹웨어 명령 열거형
_. 쓰기
_. 읽기
#그룹웨어 헬퍼 : 데이타 인터페이스
_. static 쓰기명령.Execute( 데이타인터페이스 )
{ 데이타인터페이스.Validate( 쓰기 );
데이타처리( 쓰기, 데이타인터페이스 ); }
_. static 읽기명령.Execute( 데이타인터페이스 )
{ 데이타인터페이스.Validate( 읽기 );
데이타처리( 쓰기, 데이타인터페이스 ); }
_. static 데이타처리( 명령열거형, 데이타인터페이스 )
{ ToDo: 작업... }
_. static 버튼제어( 대상버튼..., 상태값1, 상태값2.... ) //오버로딩.
{ 상태값들 별로 대상버튼 제어... }
이렇게 해두면 읽기, 쓰기 에 각각 데이타를 활용할 수 있게 만들고, 또다른 명령이 필요하면
명령열거형에 새명령 추가.
데이타에 유효성체크에 새명령에 대한 코드 추가.
헬퍼에 새명령 메서드 추가.
헬퍼에 버튼제어에 로직 추가.
이렇게 처리가 가능하다.
실제 사용할때는 !!!
# 데이타 조회
1. 그룹웨어헬퍼 인스턴스에 데이타 셋팅!
2. 그룹웨어헬퍼 인스턴스.버튼제어( 대상버튼..., 상태값1, 상태값2.... )
# 쓰기명령
1. 그룹웨어헬퍼.쓰기명령.Execute( 그룹웨어헬퍼 인스턴스 );
# 읽기명령
1. 그룹웨어헬퍼.읽기명령.Execute( 그룹웨어헬퍼 인스턴스 );
단 몇줄로 쉽게 구현이 가능하고 프레임웍 내에 귀속된다고 했을 시 어떨까?
_ 내 생각엔....
장점.
1. 역할이 분명하고, 헬퍼 자신이 가져야 할 데이타가 무척 제한적일 수 있다.
_. 그룹웨어와 관련된 데이타에 대해 제한을 둘수 있다.
erp와 그룹웨어와의 경계를 만든다.
2. 따라 처리 로직을 쉽게 찾을수 있고 새명령코드를 만들때 쉽다.
_. 실제 많은 명령을 만들어봐야 어떤지가 나올 것 같다.
유효성체크는 항상 고민이다... 추후 이녀석에 대해 써볼 예정임.
3. 담당 개발자가 작성할 소스를 줄일 수 있다.
_. 굉장히 중요하다고 생각함. 솔루션에서 유지보수를 힘들게 하는 것으로는
일정에 대한 압박으로 코드 자체를 휘저어 놓는 것인데...
( 나랑은 좀 먼 얘기? 난 일정마감이 와도 내맘대로.. 시간이 많아도 내맘대로... 고쳐야 할 습관이기도 함... )
_. 유지보수를 하는 입장에서의 소스 버젼이 다른 것들에 대해서는 참 접근이 쉽지 않다는 것이다.
특정 기능이 필요한 시점에서 정말 단발성이냐 아니냐에 따라 클래스 생성여부를 결정하는 나로써는...
이번 그룹웨어헬퍼는 사용하는 페이지가 7이었고. 동일한 데이타구조와 함께 그 기능이 동일하기에
클래스로 특화 시켜놓았다. 그리고 주석을 붙여놓았는데...
단점.
1. 동작에 대한 문서가 상세하게 작성되어야 한다.
음 난 정말 상세하게 적어두려고 읽기 좋도록 만들어보려고 노력은 하는데... 어렵다...
정리된 문서 읽는 것도 긴글들은 벅차다.
2. 이러한 패턴에 대해 유지보수 개발자는 이해하고 있어야 한다.
UI담당 개발자가 추가적인 확장이 어렵다. 곧, 헬퍼 외부에 코드를 남발해야 한다.
( 이는 프레임웍 담당 개발자가 확장시켜주면 되는데... )
3. 아무래도... 이게 실제 프레임웍을 소유하고 있는 개발자에게 부담이 되지 않을까?
남의 소스를 반가워 할 개발자는 그리 많치 않을테니..
이렇게 정리 해보았다.
퇴근중에 간단히 몇가지 생각해보니... 위 패턴은 내가 2.0프레임웍 만들때
비지니스 로직을 구현하던 중 유사하게 나타난 것이였다.
다음엔 디자인 패턴 몇개를 골라서 닷넷이 가진 매력을 뽐내볼까나...
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
Flow] Condition 만들기 - 비지터 패턴응용... (0) | 2018.04.27 |
---|---|
비지터 패턴... (0) | 2010.05.06 |
콤포지트 패턴... (0) | 2010.05.06 |
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
체인 패턴... (0) | 2010.05.04 |
[MS-SQL] 음... 잡다?
SQL을 다룰때마다 느끼는거지만... 참 재미있는게 많은데..
모르면 손가락 아프게 열심히 쳐야 한다는 사실...
항상 사용하는 것들 또 MSDN을 찾기 구찮아서 정리 해둔다..
아래 내용이면 테이블에 속성이나 자료형 길이등을 뽑아내서 스크립트화 가능한다...
index_col( object_name( t.object_id ), i.index_id, c.column_id ) 인덱스 컬럼인지 확인해준다.
type_name( c.system_type_id ) 타입명을 반환
case
when lower(type_name( c.system_type_id )) in ('char', 'varchar', 'nchar' ,'nvarchar', 'text' )
then '('+convert( varchar(10), columnproperty( c.object_id, c.name, 'precision' ) )+')'
when lower(type_name( c.system_type_id )) in ('numeric','decimal' )
then '('+ convert(varchar, c.precision) + ',' + convert(varchar, c.scale)+')'
when lower(type_name( c.system_type_id )) in ('float','datetime', 'smalldatetime', 'tinyint', 'int', 'bigint' )
then ''
else ''
end
요건 타입에 사용한 길이를 가져오는것인데...
원래 columnproperty( c.object_id, c.name, 'precision' ) 이것인데...
잘 안된다. 총 길이를 자꾸 뱉어내서 정수형 INT, BIGINT같은건 길이가 나타남
sys.tables 테이블들...
sys.columns 컬럼들...
sys.index_columns 인덱스컬럼들...
sys.extended_properties 확장속성들...
sys.foreign_key_columns 참조키 컬럼들...
DECLARE @TABLE_NAME NVARCHAR(776) = '테이블명'
select [tablename] = object_name( c.object_id ),
[columnname] = c.name,
[columndesc] = isnull(e.value, ''),
[pk/fk] = ltrim( rtrim( case
when isnull( index_col( object_name( t.object_id ), i.index_id, c.column_id ),'') <> ''
then 'pk'
else ''
end + '' +
case
when isnull( f.constraint_column_id , '' ) <> ''
then 'fk'
else ''
end )),
[allowIsNull] = isnull( case when c.is_nullable = 0 then 'no' end , ''),
[typename] = type_name( c.system_type_id ),
[columnlength] = case
when lower(type_name( c.system_type_id )) in ('char', 'varchar', 'nchar' ,'nvarchar', 'text' )
then '('+convert( varchar(10), columnproperty( c.object_id, c.name, 'precision' ) )+')'
when lower(type_name( c.system_type_id )) in ('numeric','decimal' )
then '('+ convert(varchar, c.precision) + ',' + convert(varchar, c.scale)+')'
when lower(type_name( c.system_type_id )) in ('float','datetime', 'smalldatetime', 'tinyint', 'int', 'bigint' )
then ''
else ''
end
from sys.tables t
inner join sys.columns c
on t.object_id = c.object_id -- and t.schema_id = 7
left outer join sys.index_columns i
on c.object_id = i.object_id and c.column_id = i.column_id
left outer join sys.extended_properties e
on c.object_id = e.major_id and c.column_id = e.minor_id and e.class = 1
left outer join sys.foreign_key_columns f
on c.object_id = f.parent_object_id and c.column_id = f.parent_column_id
WHERE @TABLE_NAME = case nullif( @TABLE_NAME, '') when '' then '' else OBJECT_NAME( t.object_id ) end
order by t.name, c.is_nullable, c.name
이 구문이면 테이블정보를 쉽게 파악이 가능하고
확장속성에 스크립트를 걸어두면 속성이 컬럼명 옆에 붙어 나오므로 보기 더 좋음.
이걸 편집하면 테이블 스키마는 쉽게 뽑아낼 수 있음.
참고 # SP_DEPENDS 를 편집에서 나만의 프로시져로 만들어 사용하기도 한다..
각종 시스템 프로시져를 편집에서 사용이 편리한 놈으로 개조해서 사용하기도 함!!!
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
MS-SQL ] MSDN 일부 정리! (0) | 2012.03.02 |
---|---|
MS-SQL ] 1:N 관계에서 n순번 따기... (0) | 2012.03.02 |
MS-SQL ] default (0) | 2011.11.18 |
MS-SQL ] 오류 메세지 정리 (0) | 2011.11.17 |
MS-SQL 2008] Values 의 새로운 발견!!? (1) | 2011.11.11 |
FlexGrid ] Cols[ 컬럼명 ].DataMap
DataSet ds = new DataSet();
FlexGrid.Cols[ucTY_EVALUE].DataMap
= new MultiColumnDictionary(ds.Tables[0], "DS_CODE", new string[]{"CD_CODE","DS_CODE"}, 1);
위처럼 FlexGrid에서 MultiColumnDictionary가 지원된다.
생성자가 몇가지 오버로드 되있는데 그중 위에 걸로 하면 될것 같고,
참고링크!!
http://helpcentral.componentone.com/nethelp/c1flexgrid/default.htm?turl=flexgridforwinformssamples.htm
위처럼 했을 경우
보이는건 DS_CODE 에 있는 것이 표시되고
콤보를 선택하려 클릭했을 때는
CD_CODE | DS_CODE 형태로 리스트로 아래로 뿌려진다.
맨앞 컬럼은 실제 선택시 값인데 DB에 저장할 때 위에는 DS_CODE로 코드가 아닌 이름을 그대로 저장하기 때문에
DS_CODE로 지정한 것 이다.
'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글
WinForm + WebApi ] HighLight( 하이라이트 ) (0) | 2013.08.22 |
---|---|
IFormattable 와 ( IFormatProvider, ICustomFormatter ) (0) | 2013.08.20 |
GlassForm (1) | 2011.11.15 |
Array.ConvertAll 관련... (0) | 2011.11.15 |
ClickOnce UpdateAsync ~!! (0) | 2011.10.31 |
MS-SQL ] default
음 기본값 사용에 있어서... 전에 msdn을 찾아 본 적 있는데...
DateTime 도 적용이 되는지?? 확인해보았다.
declare @tb table
(
dt varchar(20) default Convert(varchar(20), Getdate() , 121 )
)
Insert into @tb values( default );
select * from @tb;
잘 된다!!
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
MS-SQL ] 1:N 관계에서 n순번 따기... (0) | 2012.03.02 |
---|---|
[MS-SQL] 음... 잡다? (0) | 2012.01.02 |
MS-SQL ] 오류 메세지 정리 (0) | 2011.11.17 |
MS-SQL 2008] Values 의 새로운 발견!!? (1) | 2011.11.11 |
MS-SQL 2008 ] 확장속성을 컬럼명으로. 한 QUERY SP.. (0) | 2011.10.06 |
MS-SQL ] 오류 메세지 정리
/*
declare @i int = 1111111111111111111111111111
메시지 8115, 수준 16, 상태 2, 줄 2
expression을(를) 데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
*/
/*
select CONVERT( varchar(10),
'aaaaaaaaaaaaaaaa' )
'aaaaaaaaaa' -- 결과
*/
/*
declare @v table
(
valuedata varchar(4)
)
insert into @v values ( '2132132132132132321' )
메시지 8152, 수준 16, 상태 14, 줄 8
문자열이나 이진 데이터는 잘립니다.
*/
/*
declare @v INT = '본사' -- 메시지 245, 수준 16, 상태 1, 줄 3
varchar 값 '본사'을(를) 데이터 형식 int(으)로 변환하지 못했습니다.
*/
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
[MS-SQL] 음... 잡다? (0) | 2012.01.02 |
---|---|
MS-SQL ] default (0) | 2011.11.18 |
MS-SQL 2008] Values 의 새로운 발견!!? (1) | 2011.11.11 |
MS-SQL 2008 ] 확장속성을 컬럼명으로. 한 QUERY SP.. (0) | 2011.10.06 |
MS-SQL 2008 ] 테이블 컬럼 확장속성으로 설명 추가할 수 있는 도움 쿼리 (0) | 2011.10.04 |