[스크랩] C#에서 string.Empty

내가 C#을 하면서 문자열 초기화를 하면서 처음에 좀 신기했던 것이 문자열 초기화를 시킬 때 “”(큰 따옴표 묶음인 빈문자열)이 아니라, string.Empty로 초기화를 주는 것이었다.. 그래서 궁금해서 찾아봤는데.. 어떤 블로거 분이 너무 정리를 잘해주셔서 스크랩 해왔다..

출처: http://six605.tistory.com/320

C# Coding Standard (Coding Style) 을 보다 보면 다음과 같은 항목이 있다.
“”대신에 string.Empty를 사용하라!!

분명 이렇게 하라는 이유가 있을 것 같기에 자료좀 찾아 보았다.

1. string.Empty와 “”는 사용상의 약간의 차이점이 존재 하지만 동일한 의미 이다.

“”를 사용하는 곳에 string.Empty를 사용할 수 있다.
단, switch case 문에서 case 문에는 string.Emtpy가 올 수 없다.

2. string.Empty와 “”은 동일한 의미를 가지지만 내부적으로는 다르다.?!
다음의 블로그에 가보면 string.Empty와 “”는 내부적으로 다른 점을 갖고 있다고 말한다.
http://www.sleepyon.com/133
즉, “”는 컴파일 타임에 내부적으로 object 객체를 생성하고, string.Emtpy는 객체를 생성하지 않는다.
따라서 string.Emtpy를 사용하는 것이 더 효율적인 코드라고 말하고 있다.
그런데… 믿지 못하겠다. -_-;;

null 문자인지 비교하는 방법에 대한 차트도 보여주고 있다.
if (str == “”)
보다는
if (string.isNullOrEmpty(str))
이 빠른 비교 속도를 나타낸다고 한다.

Image

3. string.Emtpy 보단 “”를 사용할 때 이점이 더 많다?!
다음의 블로그에 보면 string.Empty 보다 “”를 사용할 때 이점이 더 많다고 말하고 있다.
http://dotnetperls.com/string-empty

즉, if (string.Empty == null) 보다
if (“” == null) 이 빠른 비교 속도를 나타낸다고 말하고 있다.

4. C# “” better than string.Empty ??
위 3번 글에 대한 어느 분의 대한 생각 글이다.
http://blog.dmbcllc.com/2009/04/20/c-better-than-stringempty/
3번에서 테스트한 시나리오가 현실에 맞지 않는다는 것과,
그 결과 역시 항상 “”가 너 좋지만은 않다는 것이다.
여전히 “”를 사용할 때 보다 string.Empty를 사용할 때 도 많은 이점을 누리게 된다고 말하고 있다.

난??
난 string.Emtpy를 더 즐겨 사용하려 한다.
일단 코드를 봤을 때 더 명시적으로 다가와서 좋으며
string보단 StringBuilder를 사용해야 되지 않겠는가!

C#에서 엑셀 참조시에 주의할 내용

참조추가를 누르면 탭이 여러개가 있다.. (기준은 VS2008)

.NET, COM, 프로젝트, 찾아보기, 최근에 사용한 파일

방법은 두가지가 있다.. .NET을 사용하는 방법, COM을 사용하는 방법

둘중에 아무거나 하면 된다고 한다..

나도 마찬가지로 두가지 중에 아무거나 하면 되리라 생각해서

아무거나 하니깐 되긴한다..

근데.. 문제는 COM으로 할 경우에는 개발하는 곳에 설치된 오피스와

배포지에 설치된 오피스의 버젼이 동일해야 한다..

만약 2003, 2007, 2010이 설치되어있다한다면.. 2010이

혹은 2003, 2010이 설치되어있다고 해도, 2010이

배포지에 설치되어있어야 한다.

최종 버전을 따라가는 것 같다..

나도 2003, 2010이 설치되어있는 상태에서 

2003 어샘블리를 추가했는데도

2003이 설치된 배포지에서 실행이 되지 않았다..

또 예외처리를 보니깐 2010을 찾고 있었다..

결론적으로 2010, 그러니깐 최종버전을 따라가는 것 같다..

그래서 나는 배포할 때 .NET으로 배포하도록 했다..

그리고 엑셀의 대단한 기능들을 사용하지 않기 때문에 

Microsoft.Office.Interop.Excel 11.0.0.0 과

Office 11.0.0.0을 참조했다..

그 후에 배포하니.. 별문제 없이 배포되었다..

문제는 서버인데.. 아마도 윈도서버 자체에 .NET프레임워크가 있기때문에

그리고 WIN 2008 R2 정도만 되어도 .NET 3.5는 설치되기 때문에

Microsoft.Office.Interop.Excel 11.0.0.0 과

Office 11.0.0.0정도는 무방하다 생각되었다..

결론적으로는 .NET으로 배포되었다..

그리고 아까 말했던 내용이 무엇이냐면..

COM 부분에서 

Microsoft Excel 11.0 Object Library를 추가하면 자동으로 Office도 딸려오더라..

그래서 추가가 된 것이.. Microsoft Office 11.0 Object Library인데..

참조 속성의 경로에 보면

C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll

라고 되어있는 것 처럼 14.0을 가리키게된다..

그래서 배포지에서 실행을 하면 14.0이 없다면서 에러를 뿜는다..

결론은 2003으로 배포하고 싶으면 2003만 깔아서 2003으로 배포를 하던지..

2010이 설치되어있는 상황에서 배포해서 2003에서 사용하도록 하던지다..

해결되니.. 뭐.. 쉬웠네 소리 나오네..

Excel 메서드 SaveAs()의 참고사항

기본적으로 빈값에는 False나 Null을 넣는게 일반적이라고 하던데.. 

SaveAs()에는 Type.Missing을 넣는게 더 좋다고 했다..

인터넷 어딘가에 있는 내용인데.. 기억이 안나서 예제만 올리겠다..

// to save the excel sheet….
oWorkBook.SaveAs(
strPath // File Name
, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal // Format
, Type.Missing // Password
, Type.Missing // Write Res Password
, false // Read Only Recommended
, false // Create Backup
, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared // Access Mode
, false // Conflict Resolution
, false // Add To Mru
, Type.Missing // Text Code Page
, Type.Missing // Text Visual Layout
, Type.Missing // Local
);

Data Table -> Excel

인터넷에 돌아다니는 소스를 짜집기 해서 만들었다..

가장 괜찮은 것 같다.. Data Table과 파일경로만 넣어주면 알아서 파일 만들고 프로세스는 죽는다..

완벽한 소스인듯.. ㅎㅎㅎ

 

public static bool ExportExcel2(System.Data.DataTable ds, string strPath)
{
//declaring the application
Microsoft.Office.Interop.Excel.Application oAppln;

//declaring work book
Microsoft.Office.Interop.Excel.Workbook oWorkBook;

//declaring worksheet
Microsoft.Office.Interop.Excel.Worksheet oWorkSheet;

//declaring the range
Microsoft.Office.Interop.Excel.Range oRange;

//final Text
string logText = string.Empty;
try
{
oAppln = new Microsoft.Office.Interop.Excel.Application();
oWorkBook = (Microsoft.Office.Interop.Excel.Workbook)(oAppln.Workbooks.Add(true));
oWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)(oWorkBook.ActiveSheet);
int iRow = 2;

//check for data
if (ds.Rows.Count > 0)
{
//headers
for (int j = 0; j < ds.Columns.Count; j++)
{
oWorkSheet.Cells[1, j + 1] = ds.Columns[j].ColumnName;
}

//inserting datas
for (int rowNo = 0; rowNo < ds.Rows.Count; rowNo++)
{
//in each row
for (int colNo = 0; colNo < ds.Columns.Count; colNo++)
{
// in each column
oWorkSheet.Cells[iRow, colNo + 1] = ds.Rows[rowNo][colNo].ToString();
}

//moving to next row
iRow++;
}
}

//range of the excel sheet
oRange = oWorkSheet.get_Range(“A1”, “IV1”);
oRange.EntireColumn.AutoFit();
oAppln.UserControl = false;

// to view Excel sheet…
oAppln.Visible = false;

// to save the excel sheet….
oWorkBook.SaveAs(
strPath // File Name
, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal // Format
, Type.Missing // Password
, Type.Missing // Write Res Password
, false // Read Only Recommended
, false // Create Backup
, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared // Access Mode
, false // Conflict Resolution
, false // Add To Mru
, Type.Missing // Text Code Page
, Type.Missing // Text Visual Layout
, Type.Missing // Local
);

//20120824 ADD YEAPRK START 작업 중이던 파일 닫기
oWorkBook.Close(false, false, Type.Missing);
oAppln.Quit();

Marshal.ReleaseComObject(oRange);
Marshal.ReleaseComObject(oWorkSheet);
Marshal.ReleaseComObject(oWorkBook);
Marshal.ReleaseComObject(oAppln);

oRange = null;
oWorkSheet = null;
oWorkBook = null;
oAppln = null;

GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);
//20120824 ADD YEAPRK END

// Return
return true;
}
catch (Exception ex)
{
// Return Exception Message
return false;
}
}

asp.net(C#)에서 excel application을 돌리려고 할 때 80070005 오류를 뿜을 때

ASP.NET C# 프로젝트를 작업하고 있었던 중이다…

로컬에서는 잘 돌아가던 프로그램이다..

기능을 간략하게 설명하자면..

1. 버튼을 누른다.

2. 네트워크 드라이브에 접근한다.

3. 네트워크 드라이브 상에 엑셀파일을 만든다.

기능은 간단하다..

엑셀파일을 만들 때 중요하게 여겨졌던 부분이 있다..

엑셀 파일을 만들면 2003, 2007, 2010에서 모두다 문제없이 열려야 한다..

이부분을 간과하고 xml 형식으로 엑셀 2003 파일을 만드는 방식으로 구현했다..

그래서 오피스 2003에서는 문제없이 열리지만.. 2007이나 2010에서는

파일이 열릴 때 파일형식과 내용이 다르다며 괜찮냐고 물어본다..

이게 별 문제는 아니지만.. 고객들은 이런 화면을 싫어한다..

그래서.. 엑셀 어샘블리를 참조해서 개발하는 것으로 바꾸게 되었다..

인터넷에 찾아보면 여러가지 정보가 있다.. 나도 그 정보들을 찾아봤던 사람들 중에 하나이다.

그 중에 가장 유용했던 정보를 몇가지 소개한다..

Data Table -> Excel 변환하기 http://ti1212.tistory.com/22

위에있는 방법으로 코딩하면 Data Table을 바로 Excel로 변환해서 사용할 수 있다..

그런데 문제가 있다.. Excel이 사라지지 않는다.. 프로세스가 남아있다..

그래서 프로세스삭제를 추가한 내용은 밑에 있다..

Excel 프로세스 죽이기 http://www.craigmurphy.com/blog/?p=82 (강추)

이 두개를 적절하게 섞으면 파일 생성부터 프로세스 죽이기 까지 원샷에 가능하다..

그런데 문제는 웹서버에 올리면서 부터 시작되었다.. 

저 오류때문에 엑셀이 징그럽게 느껴질 정도였다… ㅠㅠ

오류 내용은 바로.. (웹에서 메시지 박스 띄우기가 어려워서 로그파일까지 만들었었다.. ㅠㅠ)

80070005 오류로 인해 CLSID가 {00024500-0000-0000-C000-000000000046}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.

이 오류에 대한 해결방법에 대한 내용들이다.. 하지만 모두 실패했다..

권한 설정 변경 해주세요 라는 내용이 주된 내용 이었다..

일단 원인을 알아보자면.. 원인은 그렇다.. 마이크로소프트에서 애초에 막아놨다..

Office의 서버 쪽 자동화에 대한 고려 사항 http://support.microsoft.com/default.aspx?scid=kb;ko;257757

누가 그렇게 관대하다고 웹에서 서버의 어플리케이션을 마음대로 돌리냐..

이건 보안상 권장하지 않는 내용이라는 것이다.. 하지만 해결책은 강제로 권한을 주면 된다는 것..

아래에는 그 해결책에 대한 내용들이다.. 찾느라 죽을뻔 했다..

엑셀 설정 http://blog.naver.com/PostView.nhn?blogId=dbekfk&logNo=10137332952

Excel ‘ASP 0178 : 80070005’ 오류 http://yoom7ss.egloos.com/5403091

삽질 이제 그만!! http://todduf.blogspot.kr/2011/09/80070005-clsid-00024500-0000-0000-c000.html

엑셀에서 DCOM 오류 발생 http://blog.naver.com/jaewonman/100114677007

영문 사이트 http://www.sevenforums.com/microsoft-office/56884-microsoft-excel-application-entry-missing-dcomcnfg.html

그래서 나도 열심히 해봤지만.. 왜 해결이 안되는거냐고요.. 

내가 남겨놓은 로그에는 역시나 계속 그 오류메시지만 출력되고

엑셀파일은 만들어질 생각을 하지 않는 것이었다..

그래서 오기가 생기기 시작했다..

서버 설정에서 뭔가 다른 무언가가 있을 것이라고 여기며..

서버설정을 뒤지기 시작했다.. 그 중에 내 눈에 들어온 계정이 있었으니..

바로 Authenticated User!!!

authenticated users? 어떤 계정인지… http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=35&MaeulNo=14&no=16755&ref=16755

일단 보안은 잠시 잡숴 주시고.. 우리가 DCOM설정을 변경하면서 추가했던 계정 중

NETWORK SERVICE 라는 계정이 있을 것이다.

그 계정에 줬던 권한과 같이 Authenticated User에도 동일하게 줬다..

문제는 이제 해결되고야 말았다..

이 문제를 맞닥드렸을 때 해결하면 꼭 블로그에 남겨서

널리널리 전파해야한다고 생각했는데..

다행이도 해결되어서 이렇게 남긴다..

참고로 Authenicated Users 말고도 보안상으로 적합한 계정들이 존재할 수도 있으니

그부분은 독자에게 맡기겠다..

읽어주셔서 감사합니다 ^^;;