VARCHAR

Non-Unicode Variable Length character data type.

 차이점은 varchar는 유니코드를 지원하지 않고, ABCDEF 영어 문자 단위를 1 Byte로 인식한다. 

"ABCDEF" =  6byte

DECLARE @FirstName AS VARCHAR(50) = 'ABCDE'

SELECT @FirstName AS FirstName,

DATALENGTH(@FirstName) AS 

Length

UNicode Variable Length character data type. 

유니코드를 지원하며, 모든 문자 단위를 2Byte 로 인식한다.

"ABCDEF" =  12byte


DECLARE @FirstName AS NVARCHAR(50)= 'ABCDE'

SELECT @FirstName AS FirstName,

DATALENGTH(@FirstName) AS Length

NVARCHAR



영문이 들어가는 Column은 VARCHAR

영문;한글;외에 글자가 들어가는 Column은 NVARCHAR로 하는게 이상적이다.

'데이터베이스 > MSSQL' 카테고리의 다른 글

[MSSQL] Database diagram 소유자 설정  (0) 2015.11.20
[SQL] Client에서 Local Server로 접속 시 오류  (0) 2015.11.18
SQL JOIN 종류  (0) 2015.07.21
테이블 변수  (0) 2015.07.21
SQL  (0) 2015.07.20
Posted by Hoya0415
,

명명된 파이프

.NET 개발/C# 2015. 11. 11. 14:09

명명된 파이프

위키백과, 우리 모두의 백과사전.

명명된 파이프(named pipe) 또는 지명 파이프는 유닉스 및 유닉스 계열의 일반 파이프를 확장 한 것으로, 프로세스 간 통신 기법 중 하나이다. 그 개념은 마이크로소프트 윈도도 있지만, 의미는 크게 다르다. 일반 파이프는 ‘이름’이며, 사용하는 프로세스가 실행 중에만 존재한다. 명명된 파이프는 영구 프로세스가 소멸해도 계속 존재하기 때문에 사용하지 않으면 제거할 필요가 있다. 명명된 파이프 파일과 같이 취급할 수 있고 프로세스 간 통신(IPC)을 위해 프로세스가 오픈되어 사용한다. 또한 동작에서 명명된 파이프를 FIFO로 부르기도 한다.



Posted by Hoya0415
,

실버라이트와 WPF를 할 때 회사에서 구입한 컨트롤인데, 그대로 쓸만한 컨트롤들이 많았다. 디자이너가 없어서 한동안 이 회사에서 제공하는 컨트롤을 그대로 쓰곤했다..ㅎ 



이 회사는 Fiddler 도 제공한다~ 참 좋은 프로그램이다.

먼저 라이센스를 구입하면 이제 TELERIK 이 제공하는 컨트롤을 받아야한다. 

TELERIK CONTROL PANEL을 다운받고, 로그인을 하면 아래 이미지가 나온다.



실행중인 Visual Studio 를 끄고 라이센스가 있는 컨트롤을 받으면 된다.~

그럼 자동으로 Visual Studio Tool에 DLL이 참조되거나, 혹은 HTML 이나 다른 개발 툴은 다운을 받게 되어 있다.




'Software' 카테고리의 다른 글

USB 초기화 Win32DiskImager  (0) 2017.07.30
Telerik RadPDFViewer White PDF issue  (0) 2016.08.31
Telerik WPF Control 라이센스 정책  (2) 2016.08.26
Bytescout 라이센스 정책  (0) 2016.08.26
Posted by Hoya0415
,

도구 : Visual Studio 2013 Community, MSSQL


사전 지식 준비 : 

EntityFrameWork, Email 간단한 지식


.NET에는 System.Net.Mail DLL을 제공하고 있는데 Mail을 보낼 수 있는 기능이다. 

메일을 보내려면 Mail SMTP Server가 필요하다.


EmailModel 클래스를 보면, 생성자에서 인자를 받는데 Company를 이용해서 

FromEmail에 있는 SMTP 서버와 Port를 가져올것이고 IsSSL 을 사용할지도 데이터로 미리 넣어놔서 가져올 것이다.

그리고 나머지 제목, 내용, BodyHTML 여부로 인자를 줄 것인데, 굳이.. DB를 안하겠다면 Class로 만들어서 사용해도 된다..


1. 네이버 같은 경우는 로그인 후 메일 탭으로 이동하면 제일 하단에 [환경설정] 이라는 곳이 있다. 

2. 눌러보면 [POP3/SMTP 설정] 이 있는데 눌러보면 SMTP 서버와 PORT 가 있을 것이다. 이 정보가 SMTP 서버가 될것고, 이 네이버 서버를 이용하려면 사용자 정보가 필요하다. 

NetworkCredential(fromEmail.MailID, fromEmail.Password);

인증 관련해서 객체를 넣어주는 구문인데 본인 계정을 쓰면 되겠다. ㅎ


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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 public class EmailModel : IDisposable
    {
        public FromEmail fromEmail { get; set; }
        public List<ToEmail> toMails { get; set; }
        public string Header { get; set; }
        public string Body { get; set; }
        public bool IsBodyHTML { get; set; }
        public MailMessage message { get; set; }
        public SendEmailResult _result;
        public event EventHandler<SendEmailResult> EmailSendCompleted;
 
        public EmailModel(string Company, string Header, string Body, bool IsBodyHTML)
        {
            this.Header = Header;
            this.Body = Body;
            this.IsBodyHTML = IsBodyHTML;
 
            try
            {
                using (var db = new DeepViewEntities(ConnectStringBuilder.DeepViewConnectionString().ToString()))
                {
                    var fromMails = db.FromEmail.Where(email => email.Company.ToLower() == Company);
 
                    if (fromMails.Count() > 0)
                        fromEmail = fromMails.First();
                    else
                        throw new Exception("formMail에 일치하는 Company가 없습니다.");
 
                    if (fromEmail != null)
                    {
                        var toMailList = db.ToEmail.Where(tomail => tomail.ServiceID == fromEmail.ID &&
                            tomail.IsActive == true).ToList();
 
                        if (toMailList.Count > 0)
                            toMails = toMailList;
                        else
                            throw new Exception("toMail에 해당하는 유저 정보가 없습니다.");
                    }
                }
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
            }
 
 
        }
 
        public void MailSend()
        {
 
 
            string smtpServer = fromEmail.Smtp;
 
            message = new MailMessage();
            message.Subject = Header;
            message.Body = Body;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.Priority = MailPriority.High;
            if (IsBodyHTML)
                message.IsBodyHtml = true;
 
            toMails.ForEach(to => message.To.Add(to.MailID));
 
            // Credentials 계정이랑 From 계정이랑 동일 해야한다.
            message.From = new MailAddress(fromEmail.MailID);
 
            SmtpClient client = new SmtpClient(smtpServer);
            client.Port = fromEmail.SmtpPort;
            client.UseDefaultCredentials = true;
            client.Credentials = new NetworkCredential(fromEmail.MailID, fromEmail.Password);
 
            try
            {
                if (_result != null)
                    throw _result.Exception;
 
                client.Send(message);
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
                if (EmailSendCompleted != null)
                    EmailSendCompleted(this, _result);
            }
        }
 
        public void Dispose()
        {
            message.Dispose();
            GC.Collect(2);
            GC.WaitForPendingFinalizers();
        }
    }

cs




MSSQL DB


'.NET 개발 > C#' 카테고리의 다른 글

NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
명명된 파이프  (0) 2015.11.11
EntityFramework 활용하기.  (0) 2015.11.09
인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Posted by Hoya0415
,

인터넷 메시지 접속 프로토콜

위키백과, 우리 모두의 백과사전.

IMAP(Internet Message Access Protocol)는 응용 계층 인터넷 프로토콜 중 하나로, 원격 서버로부터 TCP/IP 연결을 통해 이메일을 가져오는데 사용된다. IMAP는 온라인 모드와 오프라인 모드를 모두 지원하므로 POP3를 사용할 때와 달리 이메일 메시지를 서버에 남겨 두었다가 나중에 지울 수 있다. 그러므로 다른 컴퓨터 환경에서 서로 다른 이메일 클라이언트가 같은 이메일을 받아올 수 있는 장점을 가지고 있다.

이메일 메시지는 서버로 보내져 받는 사람의 이메일 보관함에 저장된다. 사용자는 마이크로소프트 아웃룩모질라 선더버드 같은 메일 클라이언트를 사용하여 편지의 기본 헤더(제목, 송신자명, 이메일 주소 등)를 보고 메일 본문의 다운로드 여부를 정할 수도 있다. 하지만, POP3에 비해 IMAP는 메일 서버와의 통신 트래픽이 높은 단점을 가지고 있다.


'IT 개발 소식 > IT 용어' 카테고리의 다른 글

싱글턴 패턴 (singleton pattern) 이란?  (0) 2016.10.06
모델(Model) 이란?  (0) 2016.10.06
클래스의 Is a, Has a 관계  (0) 2015.12.02
hosts 파일 위치  (0) 2015.08.04
Posted by Hoya0415
,

Entity 클래스의 생성자 중에 ConnectionString 인자 값을 받을 수 있는 오버로드가 있는데 그 인자 값을 이용하여

아래의 EntityConnectionStringBuilder 를 이용하면, Entity들을 Source 단에서 설정하고 자유롭게 이동할 수 있다. 

다만, Entity의 Model을 매칭시켜줘야 한다.^^


EntityConnectionStringBuilder - EntityClient에서 사용하는 연결 문자열의 내용을 손쉽게 만들고 관리할 수 있는 방법을 제공합니다.

 속성 

   Provider : 연결 문자열의 내부 .NET Framework 데이터 공급자 이름을 가져오거나 설정합니다.

   ProviderConnectionString :  내부 공급자별 연결 문자열을 가져오거나 설정합니다. 

   Metadata : 연결 문자열의 메타데이터 위치를 가져오거나 설정합니다. 





'.NET 개발 > C#' 카테고리의 다른 글

명명된 파이프  (0) 2015.11.11
C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Posted by Hoya0415
,

"WebServiceHandlerFactory-Integrated 처리기의 모듈 목록에 잘못된 모듈 ManagedPipelineHandler가 있습니다."오류 발생시 처리 방법

증상 : IIS 7.x에서  아래와 같은 HTTP 오류가 발생한다.
오류 내용 :  
HTTP 오류 500.21 - Internal Server Error
WebServiceHandlerFactory-Integrated 처리기의 모듈 목록에 잘못된 모듈 ManagedPipelineHandler가 있습니다.

원인 : .Net Framework 4.0이 제대로 설정이 설치(설정)가 되지 않아서 발생된 문제임.

처리 방법 :  %windir%\Microsoft.NET\Framework\v4.0.21006\aspnet_regiis.exe -i
(64bit machie : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i)
Framework 버젼에 따라 경로명이 틀려질 수 있으므로 유의할 것.


Posted by Hoya0415
,


인터페이스 사용 이유 3가지

1. 일종의 규칙 만들기 

코딩을 하다가 실수 할 수 있기 떄문에 이를 미연에 방지하기 위한 방법으로 인터페이스를 사용.

인터페이스를 사용하면 규칙이 생기고 상속 받은 클래스는 내부에 정의된 형식이 반드시 구현되어야 한다. 

구현하지 않을 경우 디버깅 시, 예외를 발생시켜 마저 작성하라고 알려준다.


2. 다중 상속

C#은 기본적으로 다중상속을 지원하지 않기 때문에 꼭 필요한 상항에서는 인터페이스를 이용한 다중상속을 활용할 수 있다. 다중상속을 정의하는 방법을 잘 모르면 공부해야한다.


3. C#에 미리 정의된 인터페이스를 구현하기 위해서 사용할 때도 있다. 

IEnumerable, IEnumerator 같은 인터페이스들은 약속대로 작성만하면, 구현할 수 있다. 





'.NET 개발 > C#' 카테고리의 다른 글

C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
EntityFramework 활용하기.  (0) 2015.11.09
18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Posted by Hoya0415
,

1. 어느 상황에서 연결면 끊긴 후 서버가 클라이언트를 인지 못하는지?


2. 한 객체에 연결이 두개가 안되기 때문에, 연결이 끊기면 못받는다.


실험 테스트

1. 라이센스가 꽉찬 상태에서 , 라이센스를 얻은 Client가 네트워크가 잠시 끈기면 재 연결 시도를 하는데 라이센스를 얻지 못할 수도 있다.

2. SignalR에 연결된 상태에서 네트워크가 끊겨도, 클라이언트는 Close 이벤트, Error 이벤트는 발생하지 않는다.

 - 클라이언트는 서버에게 보내는 단향방 비동기만 가능하고, 서버는 클라이언트에게 보낼 수 없다

 - 서버는 클라이언트가 죽었다고 인지한다.



'.NET 개발 > SignalR' 카테고리의 다른 글

2015-10-14 이슈 현황  (0) 2015.10.14
라이센스 이슈 해결 리스트  (0) 2015.10.08
Azure에 SignalR 배포  (0) 2015.07.20
Posted by Hoya0415
,

라이센스 갱신은 Client에서 Hub Connection이 정상적으로 되어있는 상태에서 


라이센스 갱신 시간에 응답한 경우에만 갱신이 가능하다.


1. 라이센스 갱신 시점에서 라이센스를 생성해 줘야한다.


문제 : 라이센스 갱신 시간에 응답을 못하였을 경우. (네트워크 문제 등..)

Error StatusCode: 404, ReasonPhrase: 'Not Found', Version: 0.0, Content: System.Net.Http.StreamContent, Headers:{  Content-Length: 0 }


2. 라이센스 History를 DB에 저장해야함. 사용자가 라이센스에 변화가 있을 경우

해결방법 : 

클라이언트가 -> 서버에 접속 시 

자신의 만료 기한을 가져오는데 

그 현재 시간이 그 기한보다 초과될 경우, 라이센스가 있는지 확인해서 없으면 생성하도록 한다. 



-----------이 변화에 대해서 알 방법이 지금으로써는 없다.------

1. 라이센스가 생성되는 변화. -> 라이센스 Create 문에서 변화를 알 수 있음.
2. 라이센스가 종료되는 변화. -> 라이센스 종료시간을 계속 체크해야함 
(종료되는 변화는 알 수 가 있을까?)
라이센스 개수가 변했을 경우에 저장?  or 초당 라이센스를 넣어야하는데 무의미 .


'.NET 개발 > SignalR' 카테고리의 다른 글

연결이 끊겼을 경우의 상황을 다 알아보기.  (0) 2015.10.21
라이센스 이슈 해결 리스트  (0) 2015.10.08
Azure에 SignalR 배포  (0) 2015.07.20
Posted by Hoya0415
,