c# - 해당되는 글 5건

가장 흔하게 등장하는 유효성 검사 예제를 살펴 보자.
버튼 클릭시 텍스트박스에 빈 값이 들어갔는지를 자바스크립트로 처리하려고 한다.


1. 디자인 페이지 (aspx) 에서 <head> 태그 내에 <script> 블럭을 추가하고 자바스크립트 함수를 만든다.
function fnc_Chk_Value(objTagName, strMsg)
{
   var rtnVal;
   var tmp;
 
   tmp = objTagName.value.replace(/\s/g,'');
   if(tmp == "")
   {
     alert(strMsg + ' 입력 하세요');
     objTagName.value='';
     objTagName.focus();
     rtnVal = false;
    }
    else
    {
      rtnVal = true;
    }
    return  rtnVal;
}

2. submit을 일으키는 버튼에 다음과 같은 속성을 추가한다.
<asp:Button ID="btn_OK" runat="server" Text="확인" onClientClick="return fnc_Chk_Value(텍스트박스 ID, '값을')" onClick="btn_OK_Click()" />

정리하자면...
onClientClick 이벤트에서 return 값을 반환하는 자바스크립트 함수를 먼저 실행해서
true를 반환하면 서버사이드의 onClick 이벤트를 실행하고,
false를 반환하면 onClick 이벤트가 실행되지 않도록 막는것이다.
Trackbacks 0 | Comments 0
[C#] MS SQL 2005 CLR 통합 1 (사용자 정의 함수 만들기) <- 보러가기
지난번 게시물에 이어, 이번에는 CLR 통합기능을 사용하여 사용자 정의 프로시저를 만들어보자.

 1. 실습용 테이블 만들기
CREATE TABLE T1
(
 NUM INT IDENTITY(1,1) PRIMARY KEY,
 NAME VARCHAR(10) NULL
)

CREATE TABLE T2
(
 SEQ INT IDENTITY(1,1),
 [OPTION] VARCHAR(100),
 NUM VARCHAR(100)
)

2. 사용자정의 프로시저 만들기 준비
비주얼스튜디오 (2005 이상) 실행 -> 새 프로젝트 만들기 -> Visual C# -> Database 프로젝트 ->
SQL Server Project -> SQL 연결 문자열 작성 (위저드 이용) -> 솔루션 탐색기의 프로젝트에서 오른쪽 클릭 -> 새 항목의 저장 프로시저 선택.

3. 실습 예제 코드 (T1 테이블에 데이터를 삽입하는 프로시저)
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UP_T1_INSERT(SqlString _Name)
{
     // 1. 생성자로 한방에 끝내기
     // SqlCommand Cmd = new SqlCommand("INSERT T1 VALUES(@NAME)");

     // 쿼리문을 만들어서
     string strSql = "INSERT T1 VALUES(@NAME)";

     // SQL 커멘드 객체 -- 쿼리문을 db에 전달한다
     SqlCommand Cmd = new SqlCommand(strSql);
     Cmd.CommandText = strSql;
     Cmd.Parameters.AddWithValue("@NAME", (object)_Name);

     // 모든 준비가 끝나고 실제로 쿼리문을 날리자
     SqlContext.Pipe.ExecuteAndSend(Cmd);

     // 만든 쿼리문을 PIPE를 통해서 전달하면 쿼리문이 수행된다.
}

4. 프로젝트 빌드 후 배포

5. SQL Server Management Studio에서 등록된 프로시저 실행
EXEC UP_T1_INSERT '테스트'

6. More Examples...
Trackbacks 0 | Comments 0

우리는 어떤 면에서는 굉장히 쓸모 없을 수도 있는 기술을 아주 아주 유용하게 써먹을 수 있다.
그게 이거다! 이름하여 CLR 통합 기능 활용하기!!
MS SQL 2005에서 부터는 C# 코드로 짠 사용자 정의 함수 & 프로시저 & 트리거를 쿼리로 호출하여
바로 써먹을 수 있게 되었다. 일단 왜 이 기술이 쓸모 없을 수도 있는가를 먼저 짚고 넘어가야 할 것 같다.

1. 프로시저 등록 절차가 조금 귀찮다.
(1) C#에서 코드를 작성한다. (매번 해야한다)
(2) 아래 쿼리를 SSMS(매니지먼트 스튜디오)에서 실행한다. CLR 기능 활성화.
    EXEC sp_configure 'clr enabled' , 1 RECONFIGURE
(3) 실행해본다. select dbo.Function();

2. 더욱 끔찍한 것은... 쿼리로 어셈블리화 된 함수를 때리면 디버깅이 어렵다.
   C# 에서는 빌드 및 배포상에 아무런 문제가 없는 함수가 쿼리만 날렸다 하면 오류 대방출한다.

이 같은 문제를 껴안고 있음에도 불구하고 왜 써보아야 하는가?!
먼저, C# 코드로 SQL 데이터를 처리 할 수 있다는 장점이 있겠다. 특히 정규식 같은 경우 매우 유용하다!
또한, 함수나 프로시저 코드를 숨길 수 있다는 것은 굉장한 장점이다. 저작권을 보호할 수 있다. 그거다!
(물론, 협업이 아닌 프리나, 아르바이트를 뛰거나 할때의 가정으로) 소스코드는 매우 값진 역할을 한다.
소스코드 공개는 추가금을 요구할 수 있는 문제다. 원작자가 아니면 수정 불가능. 멋지지 않은가?
당장 시작해보자.


먼저, VS 2005 이상에서 DBMS를 MS-SQL 2005를 갖추고 있다는 전제를 깔고 시작한다. (최적환경)

VS 2005에서 새 프로젝트 -> Visual C# -> Database -> Sql Server Project로 프로젝트를 등록한다.

연결할 DB에 관해 대화창이 뜰 것이다. Sql Server 를 선택하고, 연결 커넥션을 만드는 다이얼로그가 뜨면
연결할 DB 선택하고 테스트 해본다. 테스트 성공하면 확인을 선택한다. 일단 여기까지 하면 준비는 끝이다.

이제 사용자 정의 함수를 만들어 보자.

1. 클래스 추가 : 솔루션 탐색기에서 만든 프로젝트를 오른쪽 클릭 -> 추가 -> 사용자 정의 함수

2. 만들어진 클래스를 보면 아래와 같은 기본 골격을 제공할 것이다.

 [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString Function()
    {
        // Put your code here
        return new SqlString("Hello");
    }

Hello 라는 값을 리턴해주는 기본 함수다.
 
3. 프로젝트를 다시 오른쪽 클릭 -> '빌드' -> '배포' 해준다.
   배포가 완료되었다는 메시지가 상태 표시줄에 뜨게 되면 완료된 것이다.

4. SSMS(매니지먼트 스튜디오)를 실행시키고, 새 쿼리를 띄운후 연결 시켰던 DB에서 쿼리를 날려본다.
   select dbo.Function(); -> hello 값이 출력된다면 성공적으로 사용자 함수 작성이 완료되었다.

Q1) CLR로 만든 사용자 정의 함수나 프로시저의 배포는 어떤 식으로?
-> DLL 파일이 만들어진다. 그 파일을 DB와 함께 배포하면 된다. 물론 DB는 연결했던 DB여야 한다.

Q2) 사용자 정의 함수외에 어떤 것들을 만들 수 있는가?
->  함수, 프로시저, 트리거, 사용자 정의 타입 등이 있다.
     항상 만들때 주의해야 하는 점이 하나 있는데,  [Microsoft.SqlServer.Server.SqlFunction] 와 같은
     어트리뷰트를 함수 만들때마다 매번 위에 붙여줘야 한다. 이건 규칙이다. 꼭 지켜줘야 한다.

Trackbacks 0 | Comments 0
DB 시간에 MS-SQL의 외부출력키워드인 'OUTPUT'에 대해 설명하기 위해
C#의 유사 기능인 out 키워드에 대해 공부하다가 ref랑 어떤 차이가 있는가에 대해 심히 고민되더라.
뭐... Call By Reference인거는 다 아는거니까... heap 영역의 주소를 참조해오는 포인터 비스무레한...

아무튼 요약 정리하자면
ref : 호출한 메서드에서 지역변수에 값을 할당하는 초기화 작업을 하지 않으면 써먹을수가 없다!
out : 호출되는 메서드에서 지역변수에 값을 할당하는 초기화 작업을 하지 않으면 써먹을수가 없다!
요런 차이가 있더라. 뭐, 확 안와닿을테니 예제로 키보드를 두들겨보자면....
Class Out_Ref_Test
{
      public static void Main()
      {
      }
      public static int OutTest (out testvalue)
      {
      }
      public static int RefTest (ref testvalue)
      {
      }
}

초기에 이런식으로 정의하면 OutTest가 장렬히 산화한다. 이유는?
out testvalue에 들어갈 값이 호출되기전 OutTest에서 초기선언 되지 않았기 때문이다.

Class Out_Ref_Test
{
      public static void Main()
      {
      }
      public static int OutTest (out testvalue)
      {
           testvalue = 1;
      }
      public static int RefTest (ref testvalue)
      {
      }
}

위의 경우는 지역변수인 testvalue 값을 미리 초기화 해주었기 때문에 에러 없다. -_-a

Class Out_Ref_Test
{
      public static void Main()
      {
           int testval;
         RefTest(ref testval);
      }
      public static int OutTest (out testvalue)
      {
           testvalue = 1;
      }
      public static int RefTest (ref testvalue)
      {
      }
}

위의 경우 Main에서 RefTest를 호출시에 에러가 난다. 왜 일까? 당연 참조할 값이 없으니까... 다.
int testval = 1; 이라고 초기화 해주면 에러 없이 빌드된다. 그럼 1 값을 들고 RefTest로 넘어가겠지.

Class Out_Ref_Test
{
      public static void Main()
      {
           int testval;
           OutTest(out testval);    // 출력결과는 1
           RefTest(ref testval);     // 출력결과는 1
      }
      public static int OutTest (out testvalue)
      {
           testvalue = 1;
           Console.WriteLine(testvalue);
      }
      public static int RefTest (ref testvalue)
      {
          Console.WriteLine(testvalue);
      }
}

결과적으로 이런식으로 하면 OutTest에서 Main의 testval 변수에 1 값을 선언하므로 호출된 두개의
메서드는 1 값을 출력해주고 끝낸다.

끝으로... 외부출력 키워드로 사용하는 예제를 한번 보자.
 
Trackbacks 0 | Comments 2

오늘은 Collections 클래스의 ArrayList, SortedList, HashTable, Queue, Stack 을 배웠다.
클래스를 사용할때는 new로 생성해서 쓰는거 잊지 말아야 한다. -_-a

Collections 클래스 중 SortedList와 HashTable은 Key 값과 Value 값이 쌍으로 들어가는 거란다.
아무튼, 교재보고 실습하다 이상한 점을 발견했다.
HashTable을 출력할때, 값을 Add한 순서대로 출력된다고 주석을 떡하니 달아놨는데,
현실은 시궁창... 이 아니라 이거 뭐 정렬순도 아니고 스택처럼 집어넣은 순대로 출력되는것도 아니었다.

나는 HashTable에 값을 집어 넣기를...                                     출력되는 값은
====[Key]==========[Value]=======                      ====[Key]==========[Value]=======
    strawberry             딸기                                         melon                    멜롱
    apple                    사과                                         orange                 어륀지
    orange                 어륀지                                       banana                버내너
    banana                버내너                                       apple                    사과
    melon                    멜롱                                        strawberry              딸기
==================================                      ==================================
이렇게 넣었는데,                                                   요딴식이다... 죽으까.

추측하건데 저 해쉬테이블이란 놈은 해쉬 알고리즘을 적용하여 입력순서에 상관없이
랜덤하게 저장하는 습성이 있는거 같았다. 뭐 자세한 내용은 알거 없고.
아무튼 나는 정렬이 무진장 해보고 싶었다.

국을 형님에게 당장 질의를 던졌다. 키워드는 'C# hashtable sorting'
친절한 국을 형님은 이렇게 대답하셨다.


ArrayList sorter = new ArrayList(Hashtable);
sorter.Sort();

ArrayList에 Hashtable 값을 집어넣는다...라.... 예제에 당장 적용했다.

Hashtable obj = new Hashtable();
..........
// obj.Add("키", "밸류") ... 이런 식으로 값 채운다
..........
ArrayList sorter = new ArrayList(obj.Keys);
sorter.Sort();

foreach (Object data in sorter)
{
     Console.WriteLine("{0}", data);
}

출력 결과는.....
                 입력되는 값                                             출력되는 값
====[Key]==========[Value]=======                      ====[Key]=======
    strawberry             딸기                                         apple          
    apple                    사과                                         banana          
    orange                 어륀지                                       melon            
    banana                버내너                                       orange            
    melon                    멜롱                                        strawberry      
==================================                      =================
이렇게 넣었는데,                                                  obj.Keys를 담았으므로 키 값만 가져온다.

멋지게 알파벳 오름차순 정렬이 되어주셨다. 다만, 나는 키값과 밸류값을 다 가져오고 싶다... -_-
머리를 굴려보자. 우리에겐 공부했던 것 중 자동으로 정렬해주는 SortedList 라는 물건이 있다. 당장 적용!

Hashtable obj = new Hashtable();
..........
// obj.Add("키", "밸류") ... 이런 식으로 값 채운다
..........
SortedList sorter2 = new SortedList(obj);
foreach (DictionaryEntry data in sorter2)
{
     Console.WriteLine("{0} : {1}", data.Key, data.Value);
}

                입력되는 값                                                       출력되는 값
====[Key]==========[Value]=======                      ====[Key]==========[Value]=======
    strawberry             딸기                                         apple                    사과
    apple                    사과                                         banana                버내너
    orange                 어륀지                                       melon                    멜롱
    banana                버내너                                       orange                 어륀지
    melon                    멜롱                                        strawberry              딸기
==================================                      ==================================

멋지게 오름차순으로 정렬되었다. 실제로 써먹기는 Key 값에 숫자를 넣어 인덱스로 써먹으면 되겠다.

  아무튼 결론은... 국을 형님과 손을 잡으면 된다.
Trackbacks 0 | Comments 2

microdesk's Blog is powered by Daum & tistory