2012년 11월 5일 월요일

.NET Framework 4 Client Profile

 MSDN에서 다운받은 예제의 Target framework 를 확인해 보니 ".NET Framework 4 Client Profile" 로 설정되어 있다.
Client Profile?! 사용해 보지 않은 옵션이다.



.NET Framework Client Profile
.NET Framework 4 및 그 이전 버전에서는 배포를 할 때 두가지 버전으로 배포한다.
- .NET Framework 버전(전체)
- Client Profile 버전

Client Profile 버전은 클라이언트 응용프로그램에 최적화된 .NET Framework 버전이다.


.NET Framework 4 Client Profile
.NET Framework 4 의 Subset 이다. 즉 일부 기능만 지원.
클라이언트 응용프로그램을 실행하도록 디자인된 Client Profile 은 WPF 및 WinForm 기술을 신속하게 배포할 수 있도록함.
제약 사항 및 요구 사항은 다음 링크 참조.
cf) Microsoft .NET Framework 4 Client Profile(웹 설치 관리자)


.NET Framework 4.5 Client Profile ?!
.NET Framework 4.5 가 나오면서 더이상 Client Profile 버전은 나오지 않는다. 오직 .NET Framework 전체 버전만 재배포 패키지에 사용된다. 하나의 배포 버전만 사용함으로써 복잡하지 않은 간단한 배포를 고려해가 된다.

만약, .NET Framework 4 Client Profile 이 설치된 상태에서 .NET Framework 4.5를 설치한다면 .NET Framework 4.5 Client Profile 은 .NET Framework 전체 버전으로 업데이트 된다.

 cf) .NET Framework Client Profile

@

2012년 10월 22일 월요일

Resources in WPF (Binary Resources)

WPF 에서 사용하는 리소스는 두가지 타입이 있다.
1) Binary Resource
2) Logical Resource


Binary Resources

Binary Resource 는 로그 파일, 이미지 파일, AV 파일등이 사용된다.
리소스 파일 속성에 보면 WPF 에서 정의된 Build Action 옵션이 있다.

이 중 Binary Resource 는 'Resource', 'Content(내용)' 두가지 옵션이 많이 사용된다.

*) Build Action
   파일이 빌드 및 배포 프로세스와 연결되는 방법

Resource
어셈블리에 포함되는 리소스

Content(내용)
리소스가 어셈블리에 포함되지 않는다. 어셈블리에 Custom Attribute 인 AssemblyAssociatedContentFile 를 포함시킨다.
AssemblyAssociatedContentFile 어트리뷰트에는 사용할 리소스 파일의 상대 경로를 설정한다. 이 방법을 이용하면 리소스 파일을 프로젝트에 포함 시키지 않고서도 해당 리소스를 사용할 수 있다. 동적으로 생성되는 리소스 파일을 사용할 경우 유용하다.


Resource 와 Embedded Resource 의 차이

Resource 와 Contents 빌드 액션은 Uris를 사용하여 WPF 리소스에 접근한다.
Embedded Resource 는 WPF 이전부터 사용하던 리소스 사용 방법이다.
Resource 와 Embedded Resource 두 방법 모두 어셈블리에 리소스를 포함시키지만, Resource 빌드 액션은 WPF 에서  사용하는 방법이다.


Binary Resource 접근을 위한 URIs

"Logo.jpg" 
 "A/B/Logo.jpg"
 "D:\Resource\Logo.jgp"
 http://pinvoke.net/logo.jpg
ResourceDll;component/Logo.jpg 
ResourceDll;component/A/B/Logo.jpg 
pack://siteOfOrigin:,,,/logo.jpg 
pack://siteOfOrigin:,,,/A/B/logo.jpg 



*) 참고
- Resources in WPF  1 (Binary Resources)
- WPF Application Resource, Content, and Data Files - MSDN

@

2012년 10월 21일 일요일

[MS SQL Server] Configuration Functions (Transact-SQL)


Client측에서 연결한 MS SQL SERVER 에 대한 정보가 필요했다.
정확히 말해서는 MS SQL SERVER가 한국어로 설치 되었는지, 영어인지, 그 외 언어인지를 알아야 했다. 국가별로 시간 포멧이 상이하고, 그 에 따른 쿼리문을 만들어 줘야 했기 때문에.

@@LANGID 또는 @@LANGUAGE 를 사용했다.
@@LANGID 는 현재 사용하고 있는 언어의 로컬 언어 ID 값을 리턴한다.
@@LANGUAGE 는 현재 사용하고 있는 언어의 이름을 리턴한다.

*) @@LANGID 와 같은 값들을 전역 변수 또는 Configuration Function 이라고 한다.
    연결한 MS SQL SERVER 에 대한 정보를 얻을 수 있다.

*) 참조
Change the Default Language for SQL Server
Configuration Functions (Transact-SQL) - MSDN
[MSSQL] 전역변수를 알아보자
[mssql]기본 언어 확인

@

2012년 10월 10일 수요일

Marshaling LPCTSTR


C# (Managed code) 에서 C++ DLL (Unmanaged code) 의 다음과 같은 함수를 사용해야 할 경우가 있었다.

C++
void Func(LPCTSTR szKey);

C/C++ 기억이 가물가물 하지만.. LPCTSTR 타입은 다음과 같다.
UNICODE 을 정의할 경우 -> LPCWSTR (16-bit Unicode character) 즉, CONST WCHAR *
ANSI 일 경우 -> LPCSTR (8-bit ANSI character) 즉, CONST CHAR *

*) Windows API 는 ANSI string 과 Unicode (UTF-16) string 을 사용한다.
*) C# 은 Unicode (UTF-16) 을 사용한다.

LPCTSTR 의 대응되는 C# 타입은 [UnmanagedType.LPWStr] string 이다.

C++              C#
LPCTSTR -> [UnmanagedType.LPTStr] string


UnmanagedType 열거형
매개변수나 필드를 Unmanaged 코드로 어떻게 마샬링 할 것인지 지정하는 열거타입

UnmanagedType.LPWSTR
2바이트 null 로 끝나는 유니코드 문자열. Unmanaged 함수인 CoTaskMemAlloc 로 생성된 문자열에 대해서만 사용됨.
ANSI 문자열로 마샬링할 경우에는 UnmanagedType.LPSTR, Unicode 문자열로 마샬링할 경우에는 UnmanagedType.LPWSTR 을 사용하는 것 같다. 플랫폼 종속적인 경우에는 UnmanagedType.LPTSTR 을 사용해되 괜찮을것 같다.

MarshalAsAttribute
Managed 코드와 Unmanaged 코드 사이에 데이터를 어떻게 마샬링 할 것인지 지정한다. parameter, field, return value에 사용 가능하다.



*) Windows Data Types - MSDN
*) MarshalAsAttribute Class - MSDN
*) UnmanagedType 열거형 - MSDN
*) How to map Win32 types to C# types when using P/Invoke? - stackoverflow


@

2012년 9월 27일 목요일

[VS2012] System Requirements



Visual Studio 2012 System Requirements


Supported Operating Systems
  • Windows 7 (x86 and x64)
  • Windows 8 (x86, and x64)
  • Windows Server 2008  R2 (x64)
  • Windows Server 2012 (x64)

Hardware Requirements
  • 1.6 GHz or faster processor
  • 1 GB of RAM (1.5 GB if running on a virtual machine)
  • 10 GB (NTFS) of available hard disk space
  • 5400 RPM hard drive
  • DirectX 9-capable video card running at 1024 x 768 or higher display resolution

Supported architectures
  • 32-bit (x86)
  • 64-bit (x64)


CF)

@

2012년 9월 20일 목요일

ListView VirtualMode


Virtual ListView?! ListView에 많은 데이터를 출력하게 되면 스크롤 시 데이터 출력이 느려진다. 이것을 보완하기 위한게 VirtualListView 인데 이건 MFC때도 있던 개념이다.


Settings

VirtualMode 속성값을 true로 설정하여 ListView가 가상 모드로 사용할 것임을 알린다.
VirtualListSize 값을 가상 모드에 사용할 데이터 개수로 설정한다. VirtualListSize 값이 0 보다 크면 RetrieveVirtualItem 이벤트 핸들러를 정의해야 한다. 이 이벤트 핸들러에서 ListViewItem 객체를 생성하여 ListView에 추가한다.

- VirtualMode = true
- VirtualListSize에 가상 모드 목록에 사용되는 ListViewItem 개수 설정
- RetrieveVirtualItem 이벤트 핸들러 정의


Remarks

- Items, CheckedItems, SelectedItems 프로퍼티를 사용하면 안된다. (InvalidOperationException 예외 발생)
  CheckedItems -> CheckedIndices
  SelectedItems -> SelectedIndices
- ListView에 요청이 있을때 마다 발생하는 RetrieveVirtualItem 이벤트에 대한 핸들러 정의.
- VirtualListSize 지정 후 RetrieveVirtualItem 이벤트 핸들러를 정의하지 않았을 경우





참조

ListView.VirtualMode Property - MSDN
Virtual Mode ListView - Code Project
Slow ListView? – Virtual ListView! - Alois Kraus

@

2012년 9월 19일 수요일

About ListViewItem Text Property


환경 : .NET Framework 3.5


 ListViewItem 의 Text 프로퍼티값을 입력하여 생성한 ListViewItem 객체를 ListView에 추가하였다. 그런데 ListView 에 보이는 아이템의 Text 가 입력한 값과 다르게 짤려서 출력이 되었다.

MSDN에 보니 ListViewItem 의 Text 프로퍼티값은 ListView에서 출력될 때 사용되는 값이 저장된다고 한다. 단 259자를 넘을 수 없고 넘는다면 예측할 수 없는 오류가 발생할 수 도 있다고 한다.
ListViewItem Text Property - MSDN

왜 그럴까?
확실한 정보인지는 모르겠지만 찾아본 정보에 의하면 MS 측에서 말하길,
일반적인 컨트롤과는 다르게 ListView 를 디자인 할 때는 파일과 같은 객체의 정보를 출력하기 위한 용도로 만들었다고 한다. 윈도우즈에서 파일 이름의 최대 길이는 MAX_PATH 값이다. MAX_PATH 의 값은 260이다.

OwnerDraw 프로퍼티값과 ListView의 DrawItem 이벤트를 이용하면 259자를 넘는 Text도 출력할 수 있다고 하는데 이건 손이 많이간다.
.NET ListView, max number of characters, or maximum column width? Possible to override/expand?- stackoverflow

MS 고객지원 페이지를 보니, ListViewItem 의 Text 프로퍼티값이 출력될 땐 259자만 출력 되지만 값은 원래값(259자가 넘는)을 가지고 있으므로 ListView 의 SelectedIndexChanged 이벤트 시 Text 값을 TextBox 와 같은 다른 컨트롤에 출력 하라고 한다.
ListView control can only display 259 characters per column - support.microsoft.com

아마도 WPF에서는 이런 고민이 없을텐데.. 더 좋은 방법이 없을까 싶다.

@


2012년 9월 16일 일요일

How to open a WOW64 registry key


 응용프로그램의 플랫폼x86 으로 설정하였다. 이 응용프로그램은 x86 환경에선 당연히 x86 응용프로그램으로 동작하고, x64 환경에선 x86 으로 WOW로 동작한다. 응용프로그램에서 다음과 같이 레지스트리 키를 생성한다면?!

string portRegPath = "Software\\Yuk\\MyApp\\RegDemo";
key = Registry.LocalMachine.OpenSubKey(portRegPath, true);
if (key == null)
{
      key = Registry.LocalMachine.CreateSubKey(portRegPath);
}

x86 플랫폼의 응용프로그램이 x86 응용프로그램으로 실행 될 경우 LocalMachiine 의 Software\\Yuk\\MyApp\\RegDemo 에 기록. x64 WOW 로 실행 될 경우 LocalMachine 의 Software\\Wow6432Node\\Yuk\\MyApp\\RegDemo 에 기록.

즉, WOW로 동작하는 응용프로그램을 위한 레지스트리가 따로 존재한다.


또한 CreateSubKey 에서 x86 레지스트리 경로를 사용하여 기록해도, x64에선 자동으로 Wow6432Node 레지스트리 경로에 기록된다. (레지스트리를 읽을 때도 동일하게 적용됨.)
*) x86 플랫폼으로 빌드된 응용프로그램일 경우만 그러하고, Any CPU, Mixed Ploatforms 로 빌드된 응용프로그램은 레지스트리 경로를 각각 직접 지정해줘야 한다.

직접적으로 WOW64 레지스트리 경로를 얻어야 할 경우, 다음 코드를 참조

public RegistryKey GetSoftwareRoot()
{
    var path = 8 == IntPtr.Size ? @"Software\Wow6432Node" : @"Software";
    return Registry.CurrentUser.OpenSubKey(path);
}

IntPtr 은 포인터나 핸들을 나타내는 데 사용되는 플랫폼별 형식으로 IntPtr.Size 값으로 x86 에선 4, x64 에선 8 값을 갖는다.



System.Environment.Is64BitOperationSystem
.NET Framework 4.0 이상 환경에서 개발한다면 Environment.Is64BitOperationSystem 프로퍼티를 이용하면 더 직관적으로 코딩할 수 있다. Environment.Is64BitOperaionSystem 프로퍼티는 현재 운영체제가 64비트 운영체제인지 확인해 준다.
RegistryKey registryKey; if (Environment.Is64BitOperatingSystem == true) { 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); } else { 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32); } 


참조
How to open a WOW64 registry key from a 64-bit .NET application - stackoverflow
Checking if the Current Process is 64-bit - blackwasp
Checking if the Operating System is 64-bit - blackwasp

@

2012년 9월 12일 수요일

[MS SQL Server] CONVERT, 날짜형식 변환


한국, 영문 언어만 고려한다면 상관 없겠지만 스페인 언어를 고려하다 보니 날짜 출력 포멧이 달라 신경쓸께 조금 있다.
날짜 타입의 변환을 위해서 쿼리에서 CONVERT 함수의 사용 기록을 남겨본다.


CONVERT 함수
Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )


expression

유효한 입니다.


data_type

대상 데이터 형식입니다. xml, bigintsql_variant가 있습니다. 별칭 데이터
형식은 사용할 수 없습니다. 사용 가능한 데이터 형식에 대한 자세한 내용은 데이터
형식(Transact-SQL)
을 참조하십시오.


length

대상 데이터 형식의 길이를 지정하는 선택적 정수입니다. 기본값은 30입니다. 


CONVERT 함수는 식(expression) 을 다른 데이터 형식(data_type) 으로 변환하는 함수이다.
style 옵션에 따라 여려 형식으로 변환 가능하다.

예로 들자면
DATETIME 타입을 VCHAR 타입으로 변환 하며, 여러 스타일로 출력한 모습






































































 SELECT CONVERT(VARCHAR, GETDATE(),   1) 09/13/12
 SELECT CONVERT(VARCHAR, GETDATE(),   2) 12.09.13
 SELECT CONVERT(VARCHAR, GETDATE(),   3) 13/09/12
 SELECT CONVERT(VARCHAR, GETDATE(),   4) 13.09.12
 SELECT CONVERT(VARCHAR, GETDATE(),   5) 13-09-12
 SELECT CONVERT(VARCHAR, GETDATE(),   8) 11:00:04
 SELECT CONVERT(VARCHAR, GETDATE(),   9) 09 13 2012 11:02:32:090AM
 SELECT CONVERT(VARCHAR, GETDATE(),   13) 13 09 2012 11:02:44:327
 SELECT CONVERT(VARCHAR, GETDATE(),   14) 11:02:53:733
 SELECT CONVERT(VARCHAR, GETDATE(),   20) 11:03:01:253
 SELECT CONVERT(VARCHAR, GETDATE(),   21) 2012-09-13 11:03:08.507
 SELECT CONVERT(VARCHAR, GETDATE(),   22) 09/13/12 11:03:14 AM
 SELECT CONVERT(VARCHAR, GETDATE(),   23) 2012-09-13
 SELECT CONVERT(VARCHAR, GETDATE(),   25) 2012-09-13 11:03:27.793
 SELECT CONVERT(VARCHAR, GETDATE(),   101) 09/13/2012
 SELECT CONVERT(VARCHAR, GETDATE(),   102) 2012.09.13
 SELECT CONVERT(VARCHAR, GETDATE(),   103) 13/09/2012
 SELECT CONVERT(VARCHAR, GETDATE(),   104) 13.09.2012
 SELECT CONVERT(VARCHAR, GETDATE(),   105) 13-09-2012
 SELECT CONVERT(VARCHAR, GETDATE(),   111) 2012/09/13
 SELECT CONVERT(VARCHAR, GETDATE(),   112) 20120913
 SELECT CONVERT(VARCHAR, GETDATE(),   120) 2012-09-13 11:07:24
 SELECT CONVERT(VARCHAR, GETDATE(),   121) 2012-09-13 11:07:33.880




cf) http://jhbench.tistory.com/entry/MSSQL-CONVERT%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%82%A0%EC%A7%9C-%ED%98%95%EC%8B%9D-%EB%B3%80%EA%B2%BD
cf) http://blog.naver.com/PostView.nhn?blogId=nawoo&logNo=80128144043
cf) http://www.sqlusa.com/bestpractices/datetimeconversion/


@

2012년 8월 29일 수요일

MSDN - 101 LINQ Samples







 모든 LINQ 구문을 다 따라해보기에는 너무 많고 효율도 떨어질 것 같다.
기본적인 구문을 익히고 필요에 따른 Query 가 필요할 때 찾아보면 될 것 같다.







2012년 5월 24일 목요일

Using C# DateTime in Sql query

 DB의 어떤 테이블의 컬럼 타입이 datetime 타입이 있다. 쿼리문을 문자열로 작성한 뒤 SqlDataAdapter, SqlCommand 클래스를 이용해 쿼리문을 실행시킬 경우가 있다. int 타입, byte 타입, nvarchar 타입 관련해서는 쉽게 쿼리문을 문자열로 작성할 수 있지만 컬럼 타입이 datetime 이면 생각처럼 쉽지가 않았다. 시간의 표현 범위와 다른 나라들의 시간 표현 순서도 다르고.

이 경우 SqlParameter 클래스를 이용하면 쉽게 해결 가능하다.





DateTime MyDate = new DateTime(1997, 9, 12);

SqlDataAdapter adapter = new SqlDataAdapter("select * from orders where OrderDate=@mydate",                    
"server=pedro4;database=Northwind");

SqlParameter myParam = new SqlParameter();
myParam.ParameterName = "@mydate";
myParam.SqlDbType = SqlDbType.DateTime;
myParam.Value = MyDate;
adapter.SelectCommand.Parameters.Add(myParam);

DataSet ds = new DataSet();
adapter.Fill(ds);

Console.WriteLine(ds.Tables[0].Rows.Count.ToString());
Console.ReadLine();



cf) Using C# DateTime in Sql query - Joel on Software

2012년 3월 25일 일요일

Winform 투명창 (picture box) 만들기


신기하네요!

System.Windows.Forms 네임스페이스의 Form.TransparencyKey 속성을 이용하면 투명한 영역을 만들 수 있더군요.
cf) Form.TransparencyKey - MSDN

Form.TransparencyKey 속성에 Color 값을 지정하면, 폼에서 해당 Color 값을 BackColor로 갖는 영역을 투명하게
처리해주네요.



자세한 내용은 참조한 블로그를 참조하세요.
Winform 투명창 (picturebox) 만들기 




2012년 3월 2일 금요일

SortedList(Of TKey, TValue) Class

 어떤 자료를 보다가 SortedList 라는 데이터 타입을 보고 기록에 남겨 봅니다.
자세한 정보는 MSDN에서!!
SortedList(Of TKey, TValue) Class - MSDN


SortedList(Of TKey, TValue) 는 key/value pair 을 갖는 제네릭 클래스 배열이다.
제네릭 특성을 갖는것을 보니 .NET Framework 3.5 에 포함된 것 같다.


SortedDictionary(Of TKey, TValue) 와의 관계
유사점은 유사한 객체 모델을 갖으며, O(log n) 의 시간 복잡도를 갖는다.
차이점은 메모리 사용량 과 데이터의 삽입, 삭제 속도의 차이를 갖는다.

SortedList(Of TKey, TValue) 는 SortedDictionary(Of TKey, TValue) 보다 적은 메모리를 사용한다.
SortedDictionary(Of TKey, TValue) 는 정렬되지 않은 데이터에 대하여 빠른 삽입, 삭제 속도를 갖는다.
SortedList(Of TKey, TValue) 데이터가 모두 정렬되어 있을 경우 SortedDictionary(Of TKey, TValue) 보다 빠르다.

SortedList(Of TKey, TValue) 는 Key에 의해 정렬된 Key/Value 쌍의 배열로 구현되어 있다. KeyValuePair(Of TKey, TValue) 객체를 통해 탐색할 수 있다.

이름에는 -List 라고 붙지만 Key/Value 쌍으로 데이터 갖기 때문에 Key 값은 유일한 값이여야 한다. Key 값은 Null 이 될 수 없지만 Value 값는 Null 값을 갖을 수 있다.

SortedList(Of TKey, TValue) 는 정렬 및 비교 연산을 위해 comparer 구현을 요구한다. 기본적인 comparer인 Comparer(Of T).Default 는 키 타입인 TKey 가 System.IComparable(Of T) 를 구현 했는지를 체크한다. 구현 했다면 그것을 사용한다. 만약 TKey 가 IComparable(Of T)를 구현하지 않았다면 Comparer(Of T).Default 는 키 타입 TKey 가 System.IComparable 을 구현 했는지 체크한다. 만약 이 둘 모두 구현하지 않았다면 매개변수를 갖는 생성자를 오버로드 한 뒤, System.Collections.Generic.IComparer(Of T) 를 구현해 준다.

예제를 보니 List 계열의 데이터 관리와 Dictionary 계열의 데이터 관리가 같이 사용된다.

기본적으로!
~List 는 배열로 관리되며 빠른 검색에 유리한 계열이다
~Dictionary 는 Linked List 라고 생각하고 빈번한 데이터의 추가/삭제에 유리한 계열이라 생각하자.


@

2012년 2월 14일 화요일

DateTime Format, CultureInfo format


DateTime 타입의 인스턴스로 시간값을 가지고 있을 때 ToString() 메소드를 이용해서 시간값을 여러가지 타입으로 출력할 수 있다. 월, 요일 값들을 일일이 변환해 주지 않아도 되는 편리함이 있다. 여기서 한 가지 더! 시간값을 지역 언어 설정값에 따라 지역 월, 요일 값들을 지역화 해서 출력해 주며 또한 년, 월, 일 출력 순서 또한 알맞게 변환해서 출력해 준다. 다국어 프로그래밍에 참조하면 시간을 많이 절약할 수 있을 것 같다.

[C#]public virtual string ToString(
 string format,
 IFormatProvider provider
);

format 매개변수에 출력 포멧을 설정해주고, provider 매개변수에 지역 설정을 주면 된다. MSDN의 예제를 보면 다음과 같이 다양한 포멧으로 출력 가능하다.
/** Output.
   *
   * d :08/17/2000
   * D :Thursday, August 17, 2000
   * f :Thursday, August 17, 2000 16:32
   * F :Thursday, August 17, 2000 16:32:32
   * g :08/17/2000 16:32
   * G :08/17/2000 16:32:32
   * m :August 17
   * r :Thu, 17 Aug 2000 23:32:32 GMT
   * s :2000-08-17T16:32:32
   * t :16:32
   * T :16:32:32
   * u :2000-08-17 23:32:32Z
   * U :Thursday, August 17, 2000 23:32:32
   * y :August, 2000
   * dddd, MMMM dd yyyy :Thursday, August 17 2000
   * ddd, MMM d "'"yy :Thu, Aug 17 '00
   * dddd, MMMM dd :Thursday, August 17
   * M/yy :8/00
   * dd-MM-yy :17-08-00
   */
대단하다.

자세한 설명은 MSDN 참조 :
http://msdn.microsoft.com/en-us/library/Aa326722

만약 스페인어에 해당하는 정보로 출력하자면 Provider 매개변수에 스페인어 CultureInfo 인스턴를 넘겨주면 된다.
Label1.Text = Now.ToString("D", New System.Globalization.CultureInfo("es-ES"))

대단하다.



2012년 2월 12일 일요일

[MS SQL Server] Connection string for connecting to data sources




connection string to connect to sql server database


connectionString="Data Source=YUK-PC\SQLEXPRESS;Initial Catalog=NorthwindNET;Integrated Security=SSPI"


            providerName="System.Data.SqlClient

Data Source : Sql Server가 실행되고 있는 컴퓨터의 이름, 간단히 "(local)"  이라고 입력 가능


DataBase(Initial Catalog) : 연결할 DataBase 의 이름


Integrated Security
Sql Server에 연결 및 접근하기 위한 현재 윈도우 사용자의 인증 설정
- true(yes) : 현재 윈도우 계정 자격증명이 인증에 사용되는 경우
- false(no) : sql 연결 ID와 Password가 사용되는 경우
- sspi : true 설정과 같음.
*) User ID 및 Password 를 지정한 후 Integrated Security 값을 true 로 설정한다면 User ID 및 Password 설정을 무시하고 현재 윈도우 사용자의 인증 설정이 사용된다.




cf) connection string for connecting to data sources - VKInfotek
cf) SqlConnection.ConnectionString Property - MSDN

@

2012년 1월 18일 수요일

Nullable 타입의 기본사용, Boxing, Operator

Visual Studio 2008 C# Sample 을 보다가 Nullable 타입에 대한 예제가 있어 테스트 하며 정리해 보았다.
cf)
http://code.msdn.microsoft.com/Visual-Studio-2008-C-d295cdba



■ 기본적인 사용법



    class Program

    {

        static void Main(string[] args)

        {

            DisplayValue(1);

            DisplayValue(null);

        }



        // num.Value throws an InvalidOperationException if num.HasValue is false

        static void DisplayValue(int? num)

        {

            if (num.HasValue == true)

                Console.WriteLine("num = " + num);

            else

                Console.WriteLine("num = null");



            try

            {

                Console.WriteLine("value = {0}", num.Value);

            }

            catch (InvalidOperationException e)

            {

                Console.WriteLine(e.Message);

            }

        }

    }



HasValue 프로퍼티의 사용 방법과 nullable 타입이 null 값을 갖고 있을때 Value 프로퍼티를 사용하면 예외가 발생한다.


■ Boxing



    class Program

    {

        static void Main(string[] args)

        {

            // null 값을 갖는 Nullable 타입의 박싱

            int? a;

            object oa;

            

            a = null;



            // oa값에 null 값이 할당됨. boxing 일어나지 않음.

            oa = a;



            Console.WriteLine("Testing 'a' and 'boxed a' for null...");



            // Nullable 타입 변수는 null 값과 비교할 수 있다.

            if (a == null)

                Console.WriteLine("\t a == null");



            // 박스된 nullable 변수는 null 값과 비교할 수 있다.

            // nullable 값을 박싱할 때, HasValue 값이 false 값을 갖는다면

            // 참조값을 null로 설정하기 때문이다.

            if (oa == null)

                Console.WriteLine("\t oa == null");







            // Nullable 타입의 언박싱

            Console.WriteLine("Unboxing a nullable type...");

            int? b = 10;

            object ob = b;



            // 박스된 nullable 타입을 언박스 시킬 수 있다.

            int? unBoxedB = (int?)ob;

            Console.WriteLine("\t b = {0}, unBoxedB = {1}", b, unBoxedB);



            // 박스된 nullable 타입의 값이 null 이라면 언박스 된 값도 null 이 된다.

            int? unBoxedA = (int?)oa;

            if (oa == null && unBoxedA == null)

                Console.WriteLine("\t a and unBoxedA are null");







            // 박싱된 nullable 타입을 nullable이 아닌 타입에 언박싱 시킬 수 없다.

            Console.WriteLine("Attempting to unbox into non-nullable type...");



            try

            {

                int unBoxedA2 = (int)oa;

            }

            catch (Exception e)

            {

                Console.WriteLine("\t {0}", e.Message);

            }

        }

    }






■ ?? 연산자의 사용



    class Program

    {

        static void Main(string[] args)

        {

            // ?? 연산자의 사용

            // 예제에서 x의 값이 null 이 아니면 x를 리턴, null 이면 -1을 리턴한다.

            int? x = null;

            int y = x ?? -1;

            Console.WriteLine("y == " + y);





            // Nullable Int 타입의 값을 Int 타입에 저장하는 방법

            // default 키워드는 해당 타입의 기본값을 리턴한다.

            int i = GetNullableInt() ?? default(int);

            Console.WriteLine("i == " + i);





            // ?? 연산자는 참조 타입에 대해서도 사용할 수 있다.

            string s = GetStringValue();

            Console.WriteLine("s = {0}", s ?? "null");



        }



        static int? GetNullableInt()

        {

            return null;

        }



        static string GetStringValue()

        {

            return null;

        }

    }






 Demo source




cf)
Nullable 형식 사용(C# 프로그래밍 가이드)


@


2012년 1월 17일 화요일

About XAML


xml이 무엇인지 모르고, xaml이 무엇인지도 모르고 WPF를 한다는건 말도 안되지.
xaml 코드를 Copy & Paste 만 한다면 끝나는게 아니니까.


WPF Deep Dive -2 XAML 이란 - 김명신의 즐거운 하루



@