public static string[] GetLogicalDrives()

1. namespace : System
2. 반환 값 : 각 요소에 논리 드라이브의 이름이 들어 있는 문자열의 배열. 예를 들어 컴퓨터의 하드 드라이브가 첫 번째 논리 드라이브일 경우, 반환되는 첫 번째 요소는 "C:\"
3. 예외
- IOExceptionI/O :     오류가 발생하는 경우
- SecurityException : 호출자에게 필요한 권한이 없는 경우

using System;

class Sample
{
  public static void Main()
  {
       Console.WriteLine();
       String[] drives = Environment.GetLogicalDrives();
       Console.WriteLine("GetLogicalDrives: {0}", String.Join(", ", drives));
  }
}

결과 : "GetLogicalDrives: A:\, C:\, D:\"
출처 : MSDN


-------------------------------------------------------------------------------------

public string ReturnDir()
{

string OutputPath = string.Empty;
string innerPath = string.Empty;
string[] sar  = Environment.GetLogicalDrives();


for( int i = 0; i < sar.Length; i++ )
{

string path = sar[i].ToString() + "examplePath";

dir = new DirectoryInfo( path );
       
if( !dir.Exists ) // == false
{

path = string.Empty;
dir = null;

}
else
{

innerPath = sar[i].ToString() + "examplePath";

dir = null;

}

}


OutputPath = innerPath

return OutputPath;

}

namespace InstallService
{

public delegate void MessageHandler( string msg );

public class ActBase
{

public ActBase() //생성자
{
}


#region *. 오류관련 처리 메세지 이벤트

public event MessageHandler MessageEvent;

public void FireMessageEvent( string msg )
{

if( MessageEvent == null ) return;
MessageEvent( msg );

}

#endregion

...

#region 5. WriteAppPool : 응용프로그램 풀의 추가 (XmlDocument를 이용)
/// <summary>
/// AppPool(응용프로그램 풀)의 추가
/// </summary>
public void WriteAppPool()
{

XmlDocument xdoc = new XmlDocument();
XmlDocument AddNode = new XmlDocument();
 
OrgXmlPath = Environment.SystemDirectory + "\\inetsrv\\Metabase.xml";
XmlPath  = Application.StartupPath + "\\XmlDoc\\AppPool.xml";
BackupPath = Application.StartupPath + "\\Metabase.xml";
strReturn = string.Empty;
condition = string.Empty;

try
{

//원본 파일을 공용폴더쪽에 백업한다.
File.Copy( OrgXmlPath, BackupPath, true );

//\WINDOWS\system32\inetsrv\Metabase.xml파일을 읽어와서 준비된 AppPool.xml파일의 내용을 추가한다.
xdoc.Load( OrgXmlPath );
AddNode.Load( XmlPath );
XmlNode ImportChild = xdoc.ImportNode( AddNode.DocumentElement.LastChild, true );
xdoc.DocumentElement.AppendChild( ImportChild );
xdoc.Save( OrgXmlPath );

}
catch(Exception ex)
{

condition = "e";
strReturn = "응용프로그램 풀을 등록하는 도중 다음과 같은 오류가 발생하였습니다.\n\n";
strReturn += ex.ToString();


StringBuilder sb = new StringBuilder();    
sb.Append("[ERROR]");
sb.Append(Environment.NewLine);
sb.Append("응용프로그램 풀을 등록하는 도중 다음과 같은 오류가 발생하였습니다.");
sb.Append(Environment.NewLine);
sb.Append(ex.Message);
sb.Append(Environment.NewLine);
sb.Append(ex.Source);
sb.Append(Environment.NewLine);
sb.Append(ex.StackTrace);
sb.Append(Environment.NewLine);
this.FireMessageEvent( sb.ToString());

}

}
#endregion

...

}//end Class

}//end namespace

추가 NameSpace  
using System.Diagnostics;       [Process, ProcessStartInfo]
using System.Windows.Forms; [Application]

//Environment.SystemDirectory //system32폴더)

//Application.StartupPath  //프로그램이 실행되는 폴더

/// <summary>
/// 인터넷 정보서비스를 중지
/// </summary>
public void IIS_stop()
{

Process processCmd = new Process();
ProcessStartInfo processInfo = new ProcessStartInfo();
try
{

processInfo.FileName = "Iisreset";         //실행하려는 프로세스 이름
processInfo.Arguments = @" /stop";      //실행되는 프로세스의 인자값
processInfo.UseShellExecute = false;     //운영체제 셸의 사용여부
processInfo.CreateNoWindow = true;      //새창에서 실행 할 것인지 여부
processInfo.RedirectStandardInput = true;
processInfo.RedirectStandardError = false;
processInfo.RedirectStandardOutput = false;


processCmd.StartInfo = processInfo;

processCmd.Start();                              //프로세스의 시작
processCmd.WaitForExit();                     //프로세스가 종료 될 때 까지

                                                            무기한 대기한다.
processCmd.StandardInput.Flush();

}
catch( Win32Exception ex )
{

//Exception처리 :

Win32Exception에 해당되며, 상위 Exception으로 처리해도 된다.

}
finally
{

processCmd.Close(); //프로세스연결 종료

}

}


// 실행인자를 수집한다.

public void Example()

{

string commandLineArgs = "";
foreach(string arg in Environment.GetCommandLineArgs())
{

commandLineArgs += '"' + arg + '"' + " ";

}
commandLineArgs = commandLineArgs.Trim();

Process mainProcess = null;

try
{

ProcessStartInfo p = new ProcessStartInfo(this.executablePath);
p.WorkingDirectory = Path.GetDirectoryName(this.executablePath);
p.Arguments = commandLineArgs;
mainProcess = Process.Start(p);

}
catch(Exception e)
{
}


if(mainProcess != null)
{


try
{

mainProcess.WaitForExit(); // 실행시킨 프로세스가 종료될때까지 기다린다.

}
catch (Exception e)
{

return;

}

if (mainProcess.ExitCode == 2) // 아마도 종료코드가 0 인게 정상종료일거다....
{
}
else
{
}

}

Process p = new Process();
ProcessStartInfo pinfo = new ProcessStartInfo();


pinfo.FileName = "copy";
pinfo.Arguments = "test.txt test1.txt";


p.StartInfo = pinfo;
p.Start();


이렇게 실행을 하면 파일을 찾을 수 없다고 나옵니다.
첨에는 인자로 준 파일이 없나 했는데 실제로는 Process에서 실행하는 명령의 파일 이름은 실제 존재하는 exe 실행 파일을 의미 합니다.
제가 실행 하려고 했던 copy 명령은 실제로는 cmd.exe 파일의 내부 명령입니다.
그래서 파일을 찾을 수 없다고 하는 것입니다.
하여간 하다보니 이렇게 cmd 내장 명령을 실행 하려면 어떻게 해야 하는지도 궁금해 져서 이렇게 질문을 올립니다.


Process p = new Process();
ProcessStartInfo pinfo = new ProcessStartInfo();

p.StartInfo = pinfo;


pinfo.FileName = "cmd";

pinfo.UseShellExecute=false;

pinfo.CreateNoWindow=true;

pinfo.RedirectStandardInput=true;

pinfo.RedirectStandardError=false;

pinfo.RedirectStandardOutput=false;    


p.Start();

p.StandardInput.WriteLine(@"copy G:\Test\test.xls G:\Test\test2.xls");

p.StandardInput.Flush();


//화일이 있으면 덮어쓴다.

//  p.StandardInput.WriteLine(@"Y");

//  p.StandardInput.Flush();


p.Close(); 


저는 copy 명령을 직접 날리는 것으로 했는데,,,
아래와 같이 하니까 되네요
두가지 모두 잘 됩니다.
CMD 명령어의 옵션 값으로 해결을 했습니다.


pinfo.FileName = "cmd";

pinfo.Arguments = "/C copy c:\\code39.txt com1:";


출처 :데브피아

추가 정보
한 번에 하나씩 셀을 채우지 않고 여러 셀 범위를 채우려면 Range 개체의 Value 속성을 2차원 배열로 설정하면 됩니다. 마찬가지로 Value 속성을 사용하여 한 번에 여러 셀에 대한 2차원 배열 값을 가져올 수 있습니다. 다음 단계에서는 2차원 배열을 사용하여 데이터를 설정하고 검색하는 과정을 보여 줍니다.
Microsoft Excel용 자동화 클라이언트 빌드

1. Microsoft Visual Studio 2005 또는 Microsoft Visual Studio .NET를 시작합니다.

2. 파일 메뉴에서 새로 만들기를 누르고 프로젝트를 누릅니다. Visual C# 프로젝트 형식에서 Windows 응용 프로그램을 선택합니다. 기본적으로 Form1이 만들어집니다.

3. Visual Studio 2005의 경우 Microsoft Excel 11.0 Object Library에 대한 참조나, Visual Studio .NET의 경우 Microsoft Excel Object Library에 대한 참조를 추가합니다. 해당 참조를 추가하려면 다음과 같이 하십시오.

a.  프로젝트 메뉴에서 참조 추가를 누릅니다.
b.  COM 탭에서 Microsoft Excel Object Library를 찾아 선택을 누릅니다.

Visual Studio 2005의 경우 COM 탭에서 Microsoft Excel 11.0 Object Library를 찾습니다.

참고 Microsoft Office 2003에는 PIA(기본 Interop 어셈블리)가 포함되어 있습니다. Microsoft Office XP에는 PIA가 포함되어 있지 않지만 PIA를 다운로드할 수 있습니다. Office XP PIA에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
328912 (http://support.microsoft.com/kb/328912/) Microsoft Office XP PIA를 다운로드할 수 있다 
c.  참조 추가 대화 상자에서 확인을 눌러 선택한 내용을 적용합니다. 선택한 라이브러리에 대해 래퍼를 생성할 것인지 묻는 메시지가 나타나면 예를 누릅니다.

4. 보기 메뉴에서 도구 상자를 선택하여 도구 상자를 표시합니다. 단추 두 개와 확인란 하나를 Form1에 추가합니다.

5. 확인란의 이름 및 텍스트 속성을 FillWithStrings로 설정합니다.

6. Button1을 두 번 누릅니다. 해당 폼에 대한 코드 창이 나타납니다.

7. 코드 창에서


private void button1_Click(object sender, System.EventArgs e)
{
}
   
위의 코드를 아래와 같이 바꿉니다.      

//Declare these two variables globally so you can access them from both
//Button1 and Button2.
Excel.Application objApp;
Excel._Workbook objBook;

private void button1_Click(object sender, System.EventArgs e)
{

Excel.Workbooks objBooks;
Excel.Sheets objSheets;
Excel._Worksheet objSheet;
Excel.Range range;

try
{

// Instantiate Excel and start a new workbook.
objApp = new Excel.Application();
objBooks = objApp.Workbooks;
objBook = objBooks.Add( Missing.Value );
objSheets = objBook.Worksheets;
objSheet = (Excel._Worksheet)objSheets.get_Item(1);

//Get the range where the starting cell has the address
//m_sStartingCell and its dimensions are m_iNumRows x m_iNumCols.
range = objSheet.get_Range("A1", Missing.Value);
range = range.get_Resize(5, 5);

if (this.FillWithStrings.Checked == false)
{

//Create an array.
double[,] saRet = new double[5, 5];

//Fill the array.
for (long iRow = 0; iRow < 5; iRow++)
{

for (long iCol = 0; iCol < 5; iCol++)
{
//Put a counter in the cell.
saRet[iRow, iCol] = iRow * iCol;
}

}

//Set the range value to the array.
range.set_Value(Missing.Value, saRet );

}

else
{

//Create an array.
string[,] saRet = new string[5, 5];

//Fill the array.
for (long iRow = 0; iRow < 5; iRow++)
{

for (long iCol = 0; iCol < 5; iCol++)
{
//Put the row and column address in the cell.
saRet[iRow, iCol] = iRow.ToString() + "|" + iCol.ToString();
}

}

//Set the range value to the array.
range.set_Value(Missing.Value, saRet );

}

//Return control of Excel to the user.
objApp.Visible = true;
objApp.UserControl = true;

}

catch( Exception theException )
{

String errorMessage;
errorMessage = "Error: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );

MessageBox.Show( errorMessage, "Error" );

}

}
   
참고 Visual Studio 2005에서는 코드를 변경해야 합니다. 기본적으로 Visual C#에서는 Windows Forms 프로젝트를 만들면 해당 프로젝트에 폼 하나가 추가됩니다. 이 폼의 이름은 Form1입니다. 폼을 나타내는 두 개의 파일 이름은 각각 Form1.cs와 Form1.designer.cs입니다. 코드는 Form1.cs에 작성합니다. Windows Forms 디자이너에서는 사용자가 도구 상자에서 컨트롤을 끌어 놓는 방법으로 수행한 모든 작업을 구현하는 코드를 Form1.designer.cs 파일에 작성합니다. Visual C# 2005의 Windows Forms 디자이너에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하십시오.
http://msdn2.microsoft.com/ko-kr/library/ms173077.aspx (http://msdn2.microsoft.com/ko-kr/library/ms173077.aspx)

8. Form1의 디자인 보기로 돌아가서 Button2를 두 번 누릅니다.

9. 코드 창에서

private void button2_Click(object sender, System.EventArgs e)
{
}
   
위의 코드를 아래와 같이 바꿉니다.

private void button2_Click(object sender, System.EventArgs e)
{

Excel.Sheets objSheets;
Excel._Worksheet objSheet;
Excel.Range range;

try
{

try
{


//Get a reference to the first sheet of the workbook.
objSheets = objBook.Worksheets;
objSheet = (Excel._Worksheet)objSheets.get_Item(1);

}

catch( Exception theException )
{

String errorMessage;
errorMessage = "Can't find the Excel workbook.  Try clicking Button1 " + "to create an Excel workbook with data before running Button2.";

MessageBox.Show( errorMessage, "Missing Workbook?");

//You can't automate Excel if you can't find the data you created, so
//leave the subroutine.
return;

}

//Get a range of data.
range = objSheet.get_Range("A1", "E5");

//Retrieve the data from the range.
Object[,] saRet;
saRet = (System.Object[,])range.get_Value( Missing.Value );

//Determine the dimensions of the array.
long iRows;
long iCols;
iRows = saRet.GetUpperBound(0);
iCols = saRet.GetUpperBound(1);

//Build a string that contains the data of the array.
String valueString;
valueString = "Array Data\n";

for (long rowCounter = 1; rowCounter <= iRows; rowCounter++)
{

for (long colCounter = 1; colCounter <= iCols; colCounter++)
{

//Write the next value into the string.
valueString = String.Concat(valueString,
saRet[rowCounter, colCounter].ToString() + ", ");

}

//Write in a new line.
valueString = String.Concat(valueString, "\n");

}

//Report the value of the array.
MessageBox.Show(valueString, "Array Values");

}

catch( Exception theException )
{

String errorMessage;
errorMessage = "Error: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );

MessageBox.Show( errorMessage, "Error" );

}

}


10. 코드 창의 맨 위로 스크롤합니다. using 지시문 목록의 끝에 다음 행을 추가합니다.

using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
   

자동화 클라이언트 테스트
1. F5 키를 눌러 예제 프로그램을 빌드하고 실행합니다.

2. Button1을 누릅니다. Microsoft Excel이 시작되어 새로운 통합 문서가 나타나고 첫 번째 워크시트의 A1:E5 셀이 배열의 숫자 데이터로 채워집니다.

3. Button2를 누릅니다. A1:E5 셀의 데이터가 새로운 배열에 삽입되고 결과가 메시지 상자에 표시됩니다.

4. FillWithStrings를 선택하고 Button1을 눌러 A1:E5 셀을 문자열 데이터로 채웁니다.

리눅스용이라면... http://cafe.daum.net/oraclemanager 라고 여기에 있습니다.

그리고 윈도우용이라면요.. JD1.3버젼을 받기가 어려우신 가보군요.

심파일에 가보시면.. (http://simfile.chol.com ) java라고 치시면 나옵니다.

그거 다운받으시고 설치하시면 대요. 그리고 나서.. classpath 지정을 해야지요.

classpath 지정은 자바책을 참고하시구요.

윈도우용이면 그리 설치하는 방법은 어렵지 않습니다. 그리고 중간에 에러도

거의 나지를 않지요.. 하지만..오라클을 윈도우에서 사용하는 것은 극히 위험하기

때문에(보안 문제, 재부팅을 해야하는 문제등등) 리눅스를 많이 사용하고 있답니다.

저 같은 경우엔.. 한컴리눅스3을 한컴리눅스 사이트에서 다운받아서 사용하고 있구요.

거기에 오라클을 설치해서 DB설계 프로젝트를 지금 현재 진행중입니다. (여담으로
Connection manager때뮈 골치아팠찌여..)


그리고 어떻게 설치하냐면요.. 아래를 참고하세요. 저는 아래와 같은 방법으로 합니다.

어느 분의 자료인데요.. 저는 이거 가지고 해요..

-------------------------- 자료(다른 사람 자료를 조금 고쳤습니다)--------------------------

한컴리눅스3에서 설치하기.. JAVA JDK는 설치 안해도 됩니다. 오라클에서 자동으로 읽더군요.
한컴리눅스가 좋은 점이 사용자 위주로 되어있어서 초보자가 편하다는 장점이 있었습니다.
그래서 이걸로 사용하고 있지요. 물론 멀티부팅을 해야하는 경우에도 한컴리눅스는 자동으로
잘 잡아줍니다. 아주 편하죠...아래와 같이 하시구요..
중요한 것은 오라클 설치 그룹을 만들고, 유저를 생성하고, 그런 담에 아래와 같이
vi /home/oracle/.bash_profile 을 정합니다.
그리고 나서.. 설치하다가 보면 에러가 뜨는데 이것은 $ORACLE_HOME/ctx/lib/env_ctx.mk 파일을 열고
$ORACLE_HOME/ctx/lib/env_ctx.mk 파일의 1365줄로 이동합니다.거의 마지막 부분에 있으므로 가장
마지막에서 위로 찾아 올라갑니다.
INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m 다음에 $(LDLIBFLAG)dl 을 추가하여 줍니다.
이것만 하면 됩니다. 물론 처음에는 정말 설치하기 어렵습니다. 저두 한달동안 40번을 설치를
해보았지요. 중간에 에러나서 정말 고생 많이 했지요. 하지만 아래처럼 해보니 괜찮게 되더군요.
참고하세요^^




1. OS 및 하드웨어 환경

RAM 512MB
파티션 hdb1 8GB e / ext2hdb2 1GB e /tmp ext2hdb2 1GB e swap swap

2. 설치할 프로그램 버전 및 다운로드
Oracle Oracle 9.2.0.1.0
** Oracle 9.2.0.1.0 버전은 OTN(Oracle Technology Network 에서 다운 받습니다. otn.oracle.com
모든 설치 프로그램은 /usr/local/src에 옮겨 놓습니다.

3. 설치
가) 시스템 요구사항 확인
리눅스용 오라클9i 시스템 요구사항
하드웨어 요구사항 및 명령어
최소메모리 512 MB RAM 이상#grep MemTotal /proc/meminfo
교체 공간 일반적으로 RAM 용량의 1배나 최소한 400MB RAM 이상# /sbin/swapon -s
CD-ROM 드라이브 ISO9660 포맷을 지원하는 CD-ROM
디스크 공간 오라클 9I 소프트웨어 전체를 설치하기 위해 최소 2.5GB가 필요하며, 데이터베이스를 위해서는 1GB가 추가로 필요하다.# df ?k
임시 디스크 공간 tmp directory에 최소한 400MB의 Free 영역이 필요하다. 400MB의 용량이 되지 않을 경우에는 오라클 사용자 환경변수 TEMP 와 시스템 전역변수 TMPDIR가 다른 파일시스템에 생성될 수 있다.# env | grep TEMP# env | grep TMPDIR

소프트웨어 요구사항 및 명령어
OS SUSE Linux 7.1이상, Linux Kernel 2.4.4 이상, GNU C lib 2.2# uname ?r# rpm ?qa | grep glibc
JAVA JRE ? Sun JRE 1.3.1 / JDK ? Sun JDK 1.3.1 / blackdown 1.1.8_v3 이상

나) 공유 메모리 설정
오라클사가 제공한 커널 파라미터 값에 대한 권고값
파라미터 권장값 설명
SEMMNI 100 시스템 내 세마포어 셋의 최대 개수, 동시에 사용될 수 있는 세마포어의 최대 개수를 결정한다.
SEMMNS 256 시스템 내 세마포어 전체 개수
SEMMSL 100 한 개의 세마포어 셋에 존재할 수 있는 세마포어의 최대개수.오라클 프로세스의 최대개수에 10개정도를 더한 값으로 설정한다.
(오라클 initSID.ora 파일 내의 processes 파라미터)
SEMOPM 100 시스템 내 semop를 호출할 때마다 operation의 최대 개수
SEMVMX 32767 세마포어의 최대값을 결정한다.
SHMMAX 2147483648 한 개의 공유 메모리 세그먼트의 최대 크기 (단위: 바이트)
SHMMIN 1 한 개의 공유 메모리 세그먼트의 최소 크기 (단위: 바이트)
SHMMNI 100 공유 메모리 세그먼트의 최대 개수
SHMSEG 4096 한 개의 프로세스에 연결될 수 있는 공유 메모리 세그먼트의 최대값
** 공유 메모리와 세마포어의 개수 알아보기**
[root@ora9 /]# cd /proc/sys/kernel
공유메모리
[root@ora9 kernel]# cat shmmax e SHMMAX의 설정값을 출력한다.
[root@ora9 kernel]# cat shmmni e SHMMNI의 설정값을 출력한다.
세마포어
[root@ora9 kernel]# cat sem e SEMMSL, SEMMNS, SEMOPM, SEMMNI 값
원래 공유메모리와 세마포어를 변경한 값을 적용하여 커널을 재컴파일 해야하지만 여건이 되지 않는 (필자도 커널 재컴파일 여건이 안된다.)경우 소프트웨어적으로 공유메모리와 세마포어를 변경할 수 있다.
[root@ora9 kernel]# vi /etc/sysctl.conf
다음과 같이 편집한다.

# Disables packet forwading
net.ipv4.ip_forwad = 0
# Enable source route verification
net.ipv4.conf.default.rp_filter = 1
# Disable the magic-sysrq key
kernel.sysrq = 0
kernel.shmmax = 2147483648
kernel.sem = 512 3200 100 100

다) 설치 환경설정
① Oracle 9i 압축 풀기 및 CD 굽기
오라클 사이트에서 다운 받은 파일을 /usr/local/src 폴더에 넣어둡니다.
[root@ora9 /]# cd /usr/local/src
압축을 해제합니다. (시간이 상당히 걸립니다. 느긋하게 기다립시다.)
[root@ora9 src]# zcat lnx_920_disk1.cpio.gz | cpio -idmv
[root@ora9 src]# zcat lnx_920_disk2.cpio.gz | cpio -idmv
[root@ora9 src]# zcat lnx_920_disk3.cpio.gz | cpio ?idmv
압축을 푼 파일들을 3장의 cd에 굽기 원한다면 다음과 같이 작성합니다.
[root@ora9 src]# mkisofs -r Disk1 | cdrecord -v --eject dev=0,0,0 speed=4
[root@ora9 src]# mkisofs -r Disk2 | cdrecord -v --eject dev=0,0,0 speed=4
[root@ora9 src]# mkisofs -r Disk3 | cdrecord -v --eject dev=0,0,0 speed=4
dev 번호를 알고 싶다면 다음 명령을 내리십시오.
[root@ora9 src]# cdrecord -scanbus
scsibus0:
0,0,0 0) 'ATAPI ' 'CD-R/RW 4X4X32 ' '3.LS' Removable CD-ROM
(생략)
필자의 리눅스 컴퓨터에 설치된 CD Writer는 4배속(쓰기), 4배속(재기록), 32(읽기) 이므로 스피드를 4배속으로 맞추었습니다.


⑤ 오라클 사용자와 그룹 생성
오라클 제품 설치 및 설정변경을 담당할 oinstall과 시스템 내의 오라클 데이터베이스를
관리할 dba 그룹을 생성한다.
[root@ora9 /]# groupadd oinstall
[root@ora9 /]# groupadd dba
oracle 을 사용자로 설정하고 initial group을 oinstall과 group을 dba로 그룹을 할당한다.
[root@ora9 /]# useradd -g oinstall -G dba oracle
oracle 계정의 Password를 설정한다.
[root@ora9 /]# passwd oracle
⑥ 오라클 제품이 설치될 Mount Point를 생성한다.
/opt/oracle 디렉토리를 생성하여 하위 디렉토리까지 오라클 사용자가 관리하도록 해준다.
[root@ora9 /]# mkdir /opt/oracle
[root@ora9 /]# chown -R oracle.oinstall /opt/oracle/

⑦ oracle 사용자 계정의 환경을 설정한다.(다음 내용을 빠짐없이 작성한다.)
[root@ora9 /]# vi /home/oracle/.bash_profile
# for ORACLE

export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/920
export ORACLE_OWNER=oracle
export ORACLE_SID=ora9
export ORACLE_TERM=ansi
export DISPLAY=localhost:0.0
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/demo
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=$ORACLE_HOME/JRE/bin:$ORACLE_HOME/bin:.:$PATH
export TEMPDIR=/tmp
export EDITOR=vi
export LANG=korean
# for DBA/User
umask 022


오라클 환경 설정 항목과 그에 대한 설명
설정 이름 설정 설명
ORACLE_BASE 오라클 설치 프로그램인 OUI를 저장하고 오라클 트레이스 파일 및 데이터 파일을 저장하는 디렉토리의 이름을 기록하는 오라클 환경변수 명이다.
ORACLE_HOME 현재 설치하고자 하는 오라클 데이터베이스 서버를 저장할 디렉토리명을 기록한다.
ORACLE_OWNER 오라클 제품을 컴트롤할 OS 시스템 레벨의 유저가 누구인가를 설정하는 오라클 환경변수로, 앞 단락에서 생성한 oracle 사용자를 지정한다.
LD_LIBRARY_PATH 오라클 제품을 사용할 때 사용되는 오라클 공유 라이브러리들의 경로를 나타낸다. 반드시 $ORACLE_HOME/lib를 포함하여 설정한다./
ORACLE_SID 오라클 서버 인스턴스의 이름인 Oracle System Identifier(SID)를 설정한다. 하나의 하드웨어에 여러 개의 데이터베이스 인스턴스가 존재할 수 있지만, SID는 개별 인스턴스에 대해 유일한 이름으로 명명되어야 한다.
PATH $ORACLE_HOME/bin을 포함하여 설정한다.
NLS_LANG 오라클 데이터베이스의 문자 셋을 설정한다. 여러분이 생성하게 될 데이터베이스의 문자셋과 일치해야 한다.
TNS_ADMIN Oracle Network를 구성할 때 필요한 설정파일의 위치를 지정하는 것으로, insterner.ora, tnsnames.ora, sqlnet.ora 파일들이 위치하고 있다.
ORA_NLS33 NLS_LANG 항목에 설정된 문자 셋대로 오라클 데이터베이스에서 각국의 언어 및 도량형을 제공하는 데 필요한 정보를 갖고 있는 파일들의 위치를 지정한다.
TEMPDIR 오라클 데이터베이스가 운영 중에 임시 파일들을 위치시킬 장소를 지정한다.
EDITOR SQL *Plus 상에서 edit명령어를 사용했을 때 실행할 수 있는 OS 레벨의 에디터를 지칭하는 것으로, 여러분에게 익숙할 만한 pico, vi를 설정한다.
LANG 데이터베이스의 문자 셋을 결정하는 NLS_LANG과 달리, 현재 사용자의 세션에서의 문자 셋을 결정하는 시스템 환경변수이다. 필자와 같이 ko_KR.eucKR를 설정하면 한글화된 시스템 메시지를 볼 수 있으며, 오라클에서 제공하는 모든 자바 툴에서 한글화 메시지를 바로 볼 수 있다.
DISPLAY Oracle Universal Installer 등 오라클에서 제공하는 자바로 만들어진 여러 가지 툴이 구동하기 위한 X윈도우 환경을 설정하기 위한 것으로, 사용자의 서버 명이나 IP를 설정한다.

⑧ 재부팅 합니다. (위의 공유 메모리와 세마포어 값의 변경 등을 적용하기 위함입니다.)
[root@ora9 src]# shutdown -r now

라) 설치
설치시 root계정으로 로그인 후 X-Window를 실행하고 터미널 창을 두개 띄워
위쪽 창은 root 계정으로 아래쪽 창은 oracle 계정으로 작업하도록 한다.
[root@ora9 root]# su oracle
위에서 설정한 오라클 사용자의 설정이 적용되도록 강제로 로드합니다.
[oracle@ora9 oracle]$ source $HOME/.bash_profile
다운받은 오라클 설치 프로그램의 압축을 푼 디렉토리로 이동합니다.
[oracle@ora9 oracle]$ cd /usr/local/src/Disk1
[oracle@ora9 Disk1]$ ./runInstaller

Oracle Universal Installer 가 로딩됩니다.


설치 첫 화면 입니다. “다음”을 클릭하여 계속 설치를 진행합니다.


오라클을 처음 설치할 때에만 표시되는 화면으로써, OUI 관련 파일들의 위치를 지정합니다. 사용자 환경에 ORACLE_BASE를 지정하였다면 해당 디렉토리가 표시됩니다. “확인” 버튼을 눌러 계속 설치를 진행합니다.


시스템에서 오라클을 설치하고 갱신할 수 있는 UNIX GROUP을 지정합니다.


오라클 설치 및 갱신 가능한 그룹 이름 “oinstall”을 작성하고 “다음” 버튼을 클릭합니다.



설치를 계속 하기 전에 root 권한으로 특정 파일(/tmp/orainstRoot.sh)을 실행해야 합니다.



콘솔 실행 후 root계정으로 /tmp/orainstRoot.sh 파일을 실행합니다.


이것을 실행하면 /etc/oraInst.loc 파일이 생성됩니다. 이 파일은 오라클 Inventory의 위치와
이를 다루는 유닉스 계정 그룹 명이 기록됩니다.

“계속” 버튼을 눌러 계속 설치를 진행합니다.

오라클의 원본 디렉토리를 표시하며, 사용자 환경에 설정된 ORACLE_HOME 의 이름 및
설치가 될 디렉토리가 표시된다. “다음” 버튼을 클릭하여 계속 설치를 진행한다.
만약 CD로 설치한다면 경로에 CD-ROM의 경로가 표시될 것이다.

제품을 로드 합니다.

“Oracle9i Database 9.2.0.1.0”을 선택하여 데이터베이스를 구성합니다.
“제품 언어...”를 클릭합니다.

제품언어에 한국어와 영어가 추가되어 있는지 확인합니다.
“확인” 버튼을 클릭 하여 계속 설치를 진행합니다.

설치 유형을 묻는 화면입니다. 여기서는 Enterprise Edition을 선택하여 설치합니다.
Enterprise Edition은 모든 컴포넌트가 설치 됩니다. “다음” 버튼을 클릭합니다.


“설치 유형”에서 “Database Configuration”으로 넘어가는 중간 화면 입니다.


Database Suite에서 General Purpose를 선택합니다. “다음”버튼을 클릭하여 계속 설치를 진행합니다.

l General Purpose: 범용적인 데이터베이스를 구성할 때
l Transaction Processing: OLTP성 작업이 주가 될 때
l Data Warehouse: DSS 목적으로 데이터베이스를 구성할 때
l Customized: 사용자 정의 데이터베이스를 구성할 때
l Software Only: 데이터베이스를 설치하지 않고 오라클 데이터베이스 제품만 설치할 때
“Database Configuration”에서 Database File Location”으로 넘어가는 중간 화면 입니다.

Global Database 이름을 적어 줍니다. 대개 데이터베이스 이름.네트워크 도메인 이름을 이용합니다.


개인적으로 도메인 jungyama.pe.kr을 이용하므로 ora9.jungyama.pe.kr을 작성하였습니다.
“다음”버튼을 클릭하여 계속 설치를 진행합니다.

데이터베이스 파일이 저장될 위치를 지정합니다. “다음”를 클릭하여 계속 설치를 진행합니다.


Oracle DB에서 사용할 문자 셋을 설정합니다. 이곳 설정은 $HOME/.bash_profile 의
NLS_LANG의 값과 일치해야 합니다. Default character set 이 KO16KSC5601이므로
Database Character Set을 default로 놓고 “다음” 버튼을 물러 계속 설치를 진행합니다.

설치될 목록을 확인해 보고 “설치” 버튼을 클릭하여 계속 설치를 진행합니다.
만약 구성 요소 중 변경할 사항이 있다면 “이전” 버튼을 클릭합니다.


설치가 진행되고 있는 상태 입니다. 시간이 오래 걸리니 느긋하게 기다립니다.


파일이 옮겨지고 링크 작업이 진행되고 있는 상태 입니다.
시간이 좀 걸리니 느긋하게 기다립니다.


설치가 거의 끝날 무렵 다음과 같은 오류가 납니다. 이때 어떠한 버튼도 클릭하지 않습니다.
ORACLE_HOME/ctx/lib/env_ctx.mk 파일을 엽니다.

$ORACLE_HOME/ctx/lib/env_ctx.mk 파일의 1365줄로 이동합니다.
거의 마지막 부분에 있으므로 가장 마지막에서 위로 찾아 올라갑니다.

INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m 다음에 $(LDLIBFLAG)dl 을 추가하여 줍니다.


“재시도”버튼을 클릭하여 계속 설치를 진행합니다.


링크 오류 후 링크 작업이 계속 진행되고 있는 그림 입니다.

설치를 계속 하기전에 root 권한으로 특정 파일을 실행해야 합니다


콘솔 실행 후 root계정으로 /opt/oracle/product/9.2.0/root.sh 파일을 실행합니다.

이때 local bin directory를 묻는데, 기본값 그대로 “Enter”를 누릅니다.
시간이 조금 걸리니, 느긋하게 기다립니다.

/opt/oracle/product/9.2.0/root.sh 파일이 실행되고 난 후 화면입니다.

“OK” 버튼을 클릭하여 계속 설치를 진행합니다.

설치와 링크 작업이 거의 끝나 가는 화면입니다.
이곳까지 따라오시느라 수고 많았습니다.

구성 툴이 실행됩니다. 시간이 오래 걸리니 느긋하게 기다립니다. 만약 이 단계에서 멈춘다면 환경설정 파일(.bash_profile)의 NLS_LANG 값과 설치 시 Character Set이 일치하는지 확인 합니다.


“Oracle Database Configuration Assistant”에서 내용이 없는 창이 뜹니다.
설치상에 문제가 있는 것은 아니니 조금 기다립니다.

“Database Configuration Assistant”에서 “Oracle 인스턴스 생성 및 시작” 중 화면입니다.


“Database Configuration Assistant”에서 “데이터베이스 생성 완료 중” 화면입니다.
데이터베이스 파일을 복사하여 다시 재구성하는 것이므로 시간이 오래 걸리지 않습니다.


Database Configuration Assistant 2번째 창입니다.
SYS와 SYSTEM 계정의 보안을 위하여 암호를 변경합니다.


SYS와 SYSTEM 계정의 암호를 변경 후 “암호 관리…” 버튼을 눌러봅니다.


암호 관리 창에는 계정정보를 볼 수 있습니다. SYS, SYSTEM, DBSNMP, SCOTT 계정을 제외하고 계정이 잠겨져 있는 것을 확인 할 수 있습니다. “확인” 버튼을 클릭하여 계속 설치를 진행합니다.


“확인”버튼을 클릭하여 계속 설치를 진행합니다.


“구성 툴”에서 “Starting HTTP Server” 구성이 진행중인 화면입니다.
만약 해당 구성이 필요 없다면 “정지”버튼을 클릭하여 구성을 중지합니다.


설치가 완전히 완료 되었습니다. Oracle9i Database 설치 요약 정보가 나타나는 화면입니다.


만약 설치된 제품 중에 제거하고 싶은 요소가 있다면 위에서 “설치된 제품” 버튼을 클릭하여
제거하고 싶은 항목을 클릭 후 “제거…” 버튼을 클릭하여 제거합니다.


설치를 마치려면 “종료” 버튼을 클릭 후 “예(Y)” 버튼을 클릭하여 설치를 완전히 종료합니다.


만약 다른 구성요소를 더 설치하고 싶다면 “다음 설치” 버튼을 클릭하여 다른 요소를 더 설치 합니다.


마) Database 시작과 종료
① 오라클 데이터베이스 시작하기
Database 의 시작과 종료는 반드시!! Oracle 계정으로 수행해야 합니다.
[root@ora9 /]# su oracle
[oracle@ora9 /]$ source $HOME/.bash_profile
oracle 계정으로 로그인 후 oracle 계정의 환경설정을 reload 합니다.
(처음부터 오라클 계정으로 로그인 하였다면 이 과정은 불필요합니다.)

[oracle@ora9 /]$ sqlplus /nolog
SQL>connect / as sysdba
SQL> startup
오라클 데이터베이스를 시작하고 종료하기 위해서는 OS에서의 인증과 암호 파일을 생성하는
툴인 orapwd를 통해야 한다. 그리고 sys 스키마의 권한인 sysdba 권한과 public 스키마
권한인 sysoper 권한의 특별한 시스템 권한을 소유한 사용자이어야 한다.

· sysdba : 데이터베이스 시작/종료, 아카이브 및 복구 작업, ALTER DATABASE OPEN,
MOUNT, BACKUP, CHANGE, CHARACHER SET 절의 명령어 실행
· sysoper : 데이터베이스 시작/종료, 아카이브 및 복구 작업, ALTER DATABASE OPEN,
MOUNT, BACKUP 절의 명령어 실행

SQL> SELECT * FROM v$version;
현재의 오라클 데이터베이스 인스턴스의 버전 확인하기

② 오라클 데이터베이스 종료하기
[oracle@ora9 /]$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown immediate

③ oratab 파일 편집하기
오라클 데이터베이스를 /etc/rc.d/ini.d에 스크립트로 설정하여 자동으로 실행하게 하여봅시다.
[root@ora9 /]# vi /etc/oratab
다음 부분을 수정 ([SID], [ORACLE_HOME], [자동실행/종료 플래그]로 구성되어 있습니다.)
ora9:/opt/oracle/product/9.2.0.1.0:N e ora9:/opt/oracle/product/9.2.0.1.0:Y

④ Parameter 파일 링크 (xxxxxxxxxxxx은 일정치 않은 숫자 입니다.)
[root @ora9 /]# cp /opt/oracle/admin/ora9/pfile/initora9.ora.xxxxxxxxxxxx \
/opt/oracle/product/9.2.0.1.0/dbs/initora9.ora

⑤ /etc/rc.d/init.d 에 등록하기
oracle9i 스크립트를 /etc/rc.d/init.d 에 복사합니다.
[root@ora9 /]# cp /usr/local/src/oracle9i /etc/rc.d/ini.t/
oracle9i에 실행권한을 부여합니다.
[root@ora9 /]# chmod 755 /etc/rc.d/init.d/oracle9i
실행수준 2,3,4에 해당하는 데이테베이스를 실행시키기 위하여 심볼릭 링크를 한다.
[root@ora9 /]# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc2.d/S99oracle9i
[root@ora9 /]# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc3.d/S99oracle9i
[root@ora9 /]# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc4.d/S99oracle9i
시스템을 재부팅하거나, 재실행 할 때에 데이터베이스를 중지하기 위하여 심볼릭 링크를 한다.
[root@ora9 /]# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc0.d/K01oracle9i
[root@ora9 /]# ln -s /etc/rc.d/init.d/oracle9i /etc/rc.d/rc6.d/K01oracle9i
Oracle Database를 재시작 시켜본 후, LISTENER 데몬이 띄워져 잇는지 확인합니다.
[root@ora9 /]# /etc/rc.d/init.d/oracle9i restart
[root@ora9 /]# ps ax | grep LISTENER
여기까지 따라오시느라 수고 많으셨습니다. ^^

출처 : http://blog.naver.com/mh007kim/80004437666
Pooling 기법이란?

Pooling 기법이란 미리 데이터베이스 Connection을 여러 개 만들어서 특정 공간에 저장해 놓고,
여러 사용자가 필요할 때 마다 하나씩 꺼내서 사용하고 다시 집어 넣는 방식을 말합니다. 지금까지는 JDBC에서 Connection이 필요할 때마다 생성하고, 직접 종료 시켜야 했습니다. 하지만 Connection Pooling 기법에서는 Connection Pool이라는 커넥션 관리자가 연결과 해제를 직접 관리 합니다. 데이터베이스 작업을 수행할 JSP 파일들은 Connection Pool로부터 커넥션을 하나 할당 받아서 사용하고, 사용한 후에는 다시 Connection Pool에게 넘겨줍니다. Cnnection Pool에게 넘겨진 Connection은 다른 데이터베이스 연결이 있을 때 재사용됩니다.


 
Pooling 기법

n       Connection을 생성해서 보관

n       Connection에 대한 요청이 들어오면, 보관중인 Connection중 하나를 넘겨줌

n       사용이 끝난 Connection을 다시 보관



< 출처 : http://www.jabook.org/ >



< 출처 : http://www.jabook.org/ >

Connection Pooling 기법을 사용하는 이유는 다음과 같습니다.

     Connection Pooling의 장점
n       속도향상
n       자원공유
n       Connection객체 제어

Connection 클래스는 객체화 될 때, 다른 일반적인 클래스들과는 달리 수초의 시간이 걸립니다.
이 시간은 만약 데이터베이스가 원격지에 존재한다면, 네트워크의 상태에 따라 더 지연이 될 수도 있습니다. 만약 우리가 만들 JSP 페이지가 빈번하게 데이터베이스 Connection 을 생성한다면, 이러한 시간적인 오버헤드는 전체 JSP를 느리게 만들 것입니다. 이 경우, JSP가 시작될 때 일정수의 Connection을 미리 만들어 놓고, Connection Pool을 통해 재사용 한다면 상당한 속도 향상을 기대할 수 있을 것입니다.

또 다른 측면에서 살펴보면, 데이터베이스에 대한 Connection은 우리의 시스템이 가지고 있는 자원(CPU, MEMORY, 네트워크 대역폭 등)을 일정량 사용하고 있습니다. 시스템의 자원은 한정 되어 있기 때문에, 사용자 수가 많다고 해서, 무제한 데이터베이스 Connection을 만들 수는 없습니다. 만약 시스템이 가지고 있는 자원을 초과해서 Connection을 생성하고 사용한다면, 전체 시스템의 성능은 크게 떨어질 것입니다. 또한 갑자기 시스템이 정지하는 등 예측할 수 없는 상황을 불러 일으킬 수도 있습니다. 이런 경우를 막기 위해, Connection Pool에 시스템이 허용 가능한 수만큼의 데이터베이스 Connection을 만들어 놓고, 공유해서 사용함으로써 전체 시스템의 성능을 향상시키고 안정되게 만들어 줄 수 있습니다.

출처 : http://blog.naver.com/reomereome?Redirect=Log&logNo=40026698128

1. 일단 txt를 날짜 형식으로 변환하는 방법

DateTime convDate = DateTime.Now;   //기본값으로 현재 날짜를 넣어 둡니다.
string strDate = "2004-03-18";              //임의의 날짜값을 받습니다.
convDate = DateTime.Parse(strDate);   // 스트링 형식의 날짜를 Date 형식으로 바꾸어 놓은 것입니다.

이 형변환을 통해 나중에 날짜 비교를 할때  사용하는 거죠...

2. 두 날짜간의 순서 비교
이 비교는 단순비교로 두개의 날짜를 비교해서 값을 리턴해 주는 것으로,
기준값(t1) 보다 비교값(t2)가 더 크면  (즉 t1의 날짜가 t2의 날자가 더 나중이면, t1<t2) -1을 리턴,   기준값(t1) 보다 비교값(t2)가 더 작으면(즉 t1의 날짜가 t2의 날자가 더 이전이면, t1>t2) 1을 리턴,  기준값(t1) 보다 비교값(t2)가 같으면(즉 t1의 날짜가 t2의 날자가 같으면, t1=t2) 0을 리턴합니다.

MSDN의 내용을 발췌하면...

DateTime t1 = new DateTime(100);
DateTime t2 = new DateTime(20);
if (DateTime.Compare(t1, t2) >  0) Console.WriteLine("t1 > t2");
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2");
if (DateTime.Compare(t1, t2) <  0) Console.WriteLine("t1 < t2");

이렇게 되는 것이구요.
실제 날짜를 비교해서 넣으면,(<--저 같은 초보를 위해...)

DateTime t1 = new DateTime("2004-03-17");
DateTime t2 = new DateTime("2004-03-18");
if (DateTime.Compare(t1, t2) >  0) Console.WriteLine("t1 > t2");
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2");
if (DateTime.Compare(t1, t2) <  0) Console.WriteLine("t1 < t2");

이러면 답은...뭐가 될까요?...답은...  -1이 리턴되며  표시는 t1< t2 가 화면에 표시 되겠죠?...ㅎㅎㅎ

3. 특정일에서 특정일 더하거나 빼거나 해서 날짜 구하는 법
오늘을 기준으로 날짜를 30일 더하거나 빼는 방법은...

30일 더하는 방법 : DateTime.Today.AddDays(30).ToString("yyyyMMdd")
30일 빼는 방법 : DateTime.Today.AddDays(-30).ToString("yyyyMMdd")

4. 두 날짜 사이의 간격을 구하는 방법
DateDiff 인가 하는 것이 VB에도 있구, SQL에도 있는 것인데...C#에서는 이렇게 한답니다.(사실은 이것 땜시 공부를 한거죠...ㅎㅎㅎ...)   TimeSpan을 사용하는 것인데 두가지 방법이 있습니다. 뭐...같다고도 할 수 있죠...

DateTime t1 = DateTime.Now;    //날짜형 변수 t1을 선언하는데 기본값으로 현재 날짜를 설정합니다.
DateTime t2 = DateTime.Now;    //아래부분은 사실 두개의 택스트 박스의 값을 입력 받은 것입니다.
t1 = DateTime.Parse(txt_StartDay.Text); // 이 내용은 한줄로도 가능하며...이런 형식입니다. 괜히 길게썼죠?...
t2 = DateTime.Parse(txt_EndDay.Text);  // DateTime t1 =DatTime.Parse("2004-03-18");

//TimeSpan을 쓰는 두가지 방법. 방법(1)
TimeSpan t3 = t2.Subtract(t1);

//TimeSpan을 쓰는 두가지 방법. 방법(2)
TimeSpan t4 = t2 - t1;

//위의 날짜차이를 계산하여 int 형식으로 리턴해 주며 쓰기는 이렇게 씁니다. t5, t6의 값은 같습니다.
int t5 = t3.Days;
int t6 = t4.Days;

만약 t1의 날짜가 "2004-03-18" 이고 t2의 날짜가 "2004-03-01" 이라면 -17을 리턴해 주겠죠?

출처 : http://blog.naver.com/corea4004/120007284388

가끔 부득이하게 DB에서 여러 문자열을 붙여서 읽어와야하는 경우가 있다.
이런경우 원하는 문자열을 얻기 위해서 C#에서는 IndexOf메서드와 Substring메서드를 사용할 수 있다.

예를 들어 다음과 같이 자신의 아이디와 이메일을 붙여서 읽어온 경우에는,

'c_shop' + '&' + 'choiseungdo#email.com'

다음과 같이 처리 할 수 있다.

string ex = "c_shop&choiseungdo#email.com";
int index = ex.IndexOf('&') + 1;
string ex2 = ex.Substring( index, ex.Length - index );

위에서 '+1'을 한 이유는

             ↓ indexOf = 7
"c_shop&choiseungdo#email.com"
               ↑ 여기서 부터 읽어서 잘라야 하기 때문에
                int index = ex.IndexOf('&') + 1; 이 되는 것이다.

또한 ex.Substring( index, ex.Length - index );에서 
ex.Length - index를 한 이유는 index부터 시작해서 잘라 읽어오기 때문에 ex.Length만큼 읽어오면 배열의 범위를 벗어나는 오류가 발생한다. 따라서 index만큼 제외한 길이를 읽어와야 하는 것이다.

↓               ex.Length                 ↓
"c_shop&choiseungdo#email.com"
               ↑ --ex.Length - index--↑

폼의 버튼에 gif 애니메이션 그림을 넣으려고 합니다.  
버튼의 이미지 속성에다 파일경로를 적어주니까 그냥 멈춘 그림으로 보여서요.

--> 그럴 때 쓰는 것이 ImageAnimator타입이죠.

출처 : http://www.c-sharpcorner.com/Code/2002/Nov/ThreadPoolGifs.asp

매크로를 활용하시면 좋습니다.

1. "도구" / "매크로" / "매크로 탐색기" 를 선택.
2. 아무 모듈이나 선택하고( 예를 들어, Module1 ). 더블클릭
3. 다음과 같은 텍스트를 복사
       Sub WriteCurrentTime()
        DTE.ActiveDocument.Selection.Text = System.DateTime.Now.ToString()
    End Sub
4. 필요할 때 마다,  매크로 탐색기에서 해당 함수를 더블 클릭.


매크로에서 출력만 적절하게 조합해 주시면, 귀찮은 주석 문장들을 모두 자동화할 수 있습니다. ^^

출처 : http://www.dotnetxpert.com

저자: 워이밍 리(Wei-Meng Lee), 역 한동훈


처음 닷넷을 접하는 개발자들의 공통된 문제는 닷넷 클래스 라이브러리의 수가 너무 많다는 것이다. 근래에 필자는 파일 액세스와 관련된 프로젝트를 진행하게 되면서 파일 처리에 대한 올바른 클래스를 찾아보았다. 파일 관련 클래스의 대부분은 System.IO 네임 스페이스에 있으며, 각각의 클래스들은 서로 비슷한 점이 많으므로 일반적인 파일 처리를 수행하는데 사용하는 클래스들을 정리해 보기로 마음먹었다. 본 기사에서 소개할 예제가 좀 어렵게 느껴질 수도 있겠지만 여러분이 적절한 클래스를 선택하는데 도움이 될 것은 확실하다.


Stream 클래스

스트림은 바이트 순서를 추상화한 것이다. 파일, TCP/IP 소켓, 메모리로부터 오는 것들은 모두 바이트 순서라 할 수 있다. 닷넷에서는 이러한 스트림을 Stream 클래스로 표현한다. Stream 클래스는 바이트 순서의 일반적인 뷰를 제공한다. 또한 Stream 클래스는 다른 모든 스트림의 추상 클래스이므로 Stream 클래스의 인스턴스를 직접 생성할 수 없다. 대신에 Stream 클래스는 다음과 같은 클래스로 구현된다.

BufferedStream - 성능 향상을 위해 다른 스트림에 대한 버퍼링 레이어를 제공한다
FileStream - 파일을 읽기/쓰기 기능을 제공한다
MemoryStream - 보조 저장 수단으로서 메모리를 사용하는 스트림을 제공한다
NetworkStream - 네트워크 데이터를 액세스할 수 있는 스트림을 제공한다
CryptoStream - 데이터를 암호화 전송할 수 있는 스트림을 제공한다

스트림 클래스들은 기본적으로 다음과 같은 작업을 수행한다.
- 읽기(Reading), 쓰기(Writing), 찾기(Seeking)

본 기사에서는 파일 입출력에서 빈번하게 사용되는 클래스들을 예제를 통해 살펴볼 생각이다. 비주얼 스튜디오 닷넷과 함께 제공되는 MSDN에는 각 클래스에 대한 문서화가 잘 되어 있기 때문에 여기에서는 각 클래스를 일일이 설명하는 대신 FileStream과 MemoryStream에 대해서만 살펴보고 파일 생성, 읽기, 쓰기에는 File 클래스를 사용할 것이다. 소제목을 수행할 작업에 따라 나누고, 그에 대한 예제를 설명하였다.

여기에 등장한 모든 예제는 다음 상수와 변수들을 사용한다.

Dim fs, s1, s2 As FileStream
Dim sr As StreamReader
Dim sw As StreamWriter
Dim br As BinaryReader
Dim bw As BinaryWriter
Dim ms As MemoryStream

Const FILE_NAME = "c:\textFile.txt"
Const BAK_FILE_NAME = "c:\textFile_bak.txt"
Const FILE_NAME_IMAGE = "c:\iMac.jpg"
Const FILE_NAME_BIN = "c:\bin.jpg"
Dim bytes(10) As Byte


지금까지 언급한 클래스들은 모두 System.IO 네임 스페이스에 있으므로 이 네임 스페이스를 임포트한다.

Imports System.IO


FileStream과 MemoryStream 외에 바이너리 데이터의 읽기/쓰기를 위해 BinaryReader와 BinaryWriter 클래스를 사용하며, 텍스트 데이터의 읽기/쓰기에는 StreamReader와 StreamWriter 클래스를 사용할 것이다.


참고 도서 : VB.NET Core Classes in a Nutshell
Budi Kurniawan, Ted Neward

상세설명보기
목차보기
샘플챕터보기


파일 관리

파일 생성, 삭제, 복사, 이름 변경, 지정된 파일이 있는지를 확인하기 위해 File 클래스를 사용한다. 다음 예제는 파일이 있는지 확인한 후, 파일을 복사하고 원본을 삭제한다.

'---Copy and Delete the file
If File.Exists(FILE_NAME) Then
File.Copy(FILE_NAME, BAK_FILE_NAME, True)
File.Delete(FILE_NAME)
End If


파일 생성

파일 읽기 외에 파일 생성에도 File 클래스를 사용한다. 다음 예제는 파일을 생성하고 FileStream 객체를 반환한다.

그 다음 코드는 새로운 텍스트 파일을 생성하고 StreamWriter 객체를 반환한다. 마지막으로 파일의 읽기/쓰기를 위해 File 클래스의 Open() 메소드를 사용한다.

fs = File.Create(FILE_NAME_BIN)
fs.Close()

sw = File.CreateText(FILE_NAME)
sw.Close()

fs = File.Open(FILE_NAME, FileMode.Open, FileAccess.Read, FileShare.Read)
fs.Close()


FileStream 클래스를 사용하여 바이너리 데이터 쓰기

바이너리 데이터를 파일에 저장하기 위해 FileStream 클래스를 사용한다. 다음 예제는 FileStream 클래스를 사용하여 새로운 파일을 생성하고 데이터를 바이너리로 저장한다. 모두 11바이트를 파일에 저장한 후 파일을 닫는다.

'---create a file and write some bytes to it
fs = New FileStream(FILE_NAME, FileMode.CreateNew, FileAccess.Write)
bytes(0) = 72 'H'
bytes(1) = 101 'e'
bytes(2) = 108 'l'
bytes(3) = 108 'l'
bytes(4) = 111 'o'
bytes(5) = 13 'CR'
bytes(6) = 87 'W'
bytes(7) = 111 'o'
bytes(8) = 114 'r'
bytes(9) = 108 'l'
bytes(10) = 100 'd'

fs.Write(bytes, 0, bytes.Length)
fs.Close()


StreamWriter 클래스를 사용하여 텍스트 쓰기

텍스트를 파일에 저장할 때는 다른 클래스를 사용하는 것 보다 StreamWriter 클래스를 사용하는 것이 더 쉽다. 다음 예제는 파일에 텍스트 문자열을 저장하기 위해 StreamWriter 클래스를 사용한다.

'---Using a streamWriter to write to a file
sw = New StreamWriter(FILE_NAME, True, System.Text.ENCODING.ASCII)
sw.WriteLine("Welcome to VB.NET")
sw.Close()


FileStream 클래스를 사용하여 바이너리 데이터 읽기

파일에서 바이너리 데이터를 읽어오려면 FileStream 클래스를 사용해야 한다. 다음 예제는 파일을 열고 바이너리 데이터를 읽어온다. 읽어온 바이트를 ASCII 문자로 변환한 다음에 화면에 출력한다.

'---open a file and read the byte(s) out
fs = New FileStream(FILE_NAME, FileMode.Open, FileAccess.Read)
fs.Read(bytes, 0, bytes.Length)
Dim i As Short
For i = 0 To bytes.Length - 1
 Console.Write(Chr(bytes(i)))
Next


찾기(Seeking)

스트림 객체는 찾기를 지원한다. 다음 예제는 FilStream 객체를 사용하여 현재 위치에서 11번째 바이트로 이동한 후에 6 바이트를 읽어온다.

'---seeking
fs.Seek(11, SeekOrigin.Current)
fs.Read(bytes, 0, 6)
For i = 0 To 5
 Console.Write(Chr(bytes(i)))
Next
fs.Close()


※ 역자주: Read 함수들은 데이터를 읽어온 다음에 현재 위치를 다음 위치로 이동시키지만 Seek 함수들은 데이터를 읽어오기만 하며 위치를 이동시키지 않는다. 여기에 소개된 예제처럼 파일 내에서 위치를 이동하기 위해 Seek를 사용하기도 한다.


StreamReader 클래스를 사용하여 텍스트 읽기

텍스트 파일을 읽어오기 위해 StreamReader 클래스를 사용한다. 다음 예제는 StreamReader 객체를 사용하여 읽어올 파일을 연다. 파일을 줄 단위로 읽어온 다음에 각 줄을 화면에 출력한다.


'---open a file and read line by line using a streamreader
sr = New StreamReader(FILE_NAME)
Dim line As String = sr.ReadLine()

While Not line Is Nothing
Console.Write(line)
line = sr.ReadLine()
End While
sr.Close()


BinaryReader와 BinaryWriter 클래스를 사용하여 바이너리 데이터 읽고 쓰기

바이너리 데이터의 읽기/쓰기에는 FileStream 클래스 뿐만 아니라 BinaryReader와 BinaryWriter 클래스도 사용할 수 있다. 다음 예제는 하나의 파일을 읽어와서 다른 파일에 그 내용을 저장하는 것으로 결국에는 파일을 복사하는 것과 동일하다. 예제에서는 FileStream 클래스를 사용하여 두 개의 파일을 연다. 하나는 파일을 읽어오기 위한 것이며, 다른 하나는 파일을 저장하기 위한 것이다. FileStream에서 바이너리 데이터를 읽어오기 위해 BinaryReader 클래스를, 바이너리 데이터를 파일에 저장하기 위해 BinaryWriter 클래스를 사용한다.

'---read from and write to a binary file
s1 = New FileStream(FILE_NAME_IMAGE, FileMode.Open, FileAccess.Read)
s2 = New FileStream("c:\iMac_copy.jpg", FileMode.CreateNew, FileAccess.Write)

br = New BinaryReader(s1)
bw = New BinaryWriter(s2)

Dim byteRead As Byte
Dim j As Integer
For j = 0 To br.BaseStream.Length() - 1
byteRead = br.ReadByte
bw.Write(byteRead)
Next
br.Close()
bw.Close()


MemoryStream 클래스를 사용하여 바이너리 데이터 쓰기

특별한 용도를 위해 파일에서 읽어온 바이너리 데이터를 메모리에 저장하는 경우가 있다. 이러한 경우의 가장 좋은 예는 윈도우 폼에서 사용하는 PictureBox 컨트롤이다. 다음 예는 BinaryReader 클래스를 사용하여 파일을 바이너리 데이터로 읽어와서 MemoryStream 객체에 저장한다. 그 다음에 PictureBox 컨트롤은 MemoryStream에 비트맵 이미지로 저장된 데이터를 사용한다.

'--read from a binary stream and write into a memory stream
s1 = New FileStream(FILE_NAME_IMAGE, FileMode.Open, FileAccess.Read)
ms = New MemoryStream(s1.Length)
br = New BinaryReader(s1)
Dim bytesRead As Byte() = br.ReadBytes(s1.Length)
ms.Write(bytesRead, 0, s1.Length)
PictureBox1.Image = New Bitmap(ms)


나머지 유용한 함수들

암호화 API를 사용하는 경우와 같이 문자열을 바이트 배열로 변환하거나 그 반대로 변환할 필요가 있다. 이러한 변환을 쉽게 할 수 있는 세가지 함수를 살펴보자.

stringcharToByteArray(): 문자열을 바이트 배열로 변환한다
stringToByteArray(): 숫자로 구성된 문자열을 바이트 배열로 변환한다
byteArrayToString(): 바이트 배열을 문자열로 변환한다


Public Function stringcharToByteArray(ByVal str As String) As Byte()
'e.g. "abcdefg" to {a,b,c,d,e,f,g}
Dim s As Char()
s = str.ToCharArray
Dim b(s.Length - 1) As Byte
Dim i As Integer
For i = 0 To s.Length - 1
 b(i) = Convert.ToByte(s(i))
Next
Return b
End Function


Public Function stringToByteArray(ByVal str As String) As Byte()
' e.g. "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16" to
'{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
Dim s As String()
s = str.Split(" ")
Dim b(s.Length - 1) As Byte
Dim i As Integer
For i = 0 To s.Length - 1
 b(i) = Convert.ToByte(s(i))
Next
Return b
End Function


Public Function byteArrayToString(ByVal b() As Byte) As String
Dim i As Integer
Dim s As New System.Text.StringBuilder()
For i = 0 To b.Length - 1
 Console.WriteLine(b(i))
 If i <> b.Length - 1 Then
  s.Append(b(i) & " ")
 Else
  s.Append(b(i))
 End If
Next
Return s.ToString
End Function


※ 역자주: 위에 소개한 유틸리티 함수들은 닷넷 프레임워크의 System.Text 네임스페이스의 ENCODING.GetBytes()와 ENCODING.GetString()으로 이미 구현되어 있다

아이콘에 마우스를 올려 놓으면 단축키가 나오면 매우 편리하겠는데...
옵션에는 그런 것이 보이지 않는다. 그런데, 그 옵션은 다른데 있었다.

[도구모음 오른쪽클릭] -> 사용자 지정 -> 옵션 -> 스크린 팁에 바로가기 키 표시

이렇게 하면 단축키가 팁에 같이 올라온다....

C#은 클래스 내부의 멤버를 노출하거나 숨길때 사용하도록 여러 접근 한정자를 제공합니다. 일반적으로 클래스는 자신의 멤버 데이터는 외부에 대해 숨기고, 필요한 메쏘드만 노출합니다. 데이터를 숨기는 이유는 클래스 외부에서 누군가가 그 데이터의 값을 변경할 수 있게 되면 나중에 프로그램에 문제가 생겼을 때 문제가 어디서 발생했는지를 발견하기가 매우 힘들어지기 때문입니다. class는 접근 제한자를 명시해주지 않으면 기본적으로 private으로 접근 제한자를 적용합니다. (그 외의 한정자 대해서는 아래 다 링크가 되어있습니다.)

한정자 용도
액세스 한정자 형식 및 형식 멤버의 선언된 액세스 가능성을 지정합니다.
abstract 클래스가 다른 클래스의 기본 클래스로만 사용됨을 나타냅니다.
const 필드 또는 지역 변수의 값을 수정할 수 없도록 지정합니다.
event 이벤트를 선언합니다.
extern 메서드가 외부에서 구현됨을 나타냅니다.
override 기본 클래스로부터 상속된 가상 멤버의 새 구현을 제공합니다.
readonly 선언의 일부로서 또는 동일한 클래스의 생성자에서만 값을 할당받을 수 있는 필드를 선언합니다.
sealed 클래스가 상속될 수 없도록 지정합니다.
static 특정 개체가 아니라 형식 자체에만 속하는 멤버를 선언합니다.
unsafe 안전하지 않은 컨텍스트를 선언합니다.
virtual 파생 클래스의 재지정 멤버에 의해 구현이 변경될 수 있는 메서드 또는 접근자를 선언합니다.
volatile 필드가 운영 체제, 하드웨어 또는 동시에 실행되는 스레드 등에 의해 프로그램에서 수정될 수 있음을 나타냅니다.
new 기본 클래스 멤버에서 상속된 멤버를 숨기는 데 사용됩니다.

출처 : MSDN

SQL문은 프로시져로 되어 있구요 아주 기초적인것이라.. 크리스탈리포트로 인쇄하는 기본적인것을 알려고할때 좋은 자료인것 같습니다...

프로시저 내용은
-- 크리스탈 레포트 출력 예제를 위한 스토어드 프로시져
CREATE PROCEDURE REPORT_TEST
@CustomerID VARCHAR(20) = '' -- 검색어
AS
BEGIN
SELECT OrderID
, CustomerID
, EmployeeID
, OrderDate
FROM Orders
WHERE CustomerID Like '%' + LTRIM(@CustomerID) + '%'
ORDER BY OrderID ASC
END

출처: http://cafe.daum.net/aspdotnet

7.0 앞부분에 해당하는 메뉴얼 이지만....8.0 에서도 적용할 수 있는 부분이 상당하다.

-크리스탈리포트 닷넷을 이용한 웹리포팅 관련 엑셀 출력 및 PDF출력 리포팅 방식을 설명드립니다.

using System;
using System.Data;
using System.Data.SqlClient;
using CrystalDecisions.Shared;
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;

namespace JDictionary.Dictionary
{

   /// <summary>
   /// ExportPDFSearch에 대한 요약 설명입니다.
   /// </summary>
   public class ExportPDFSearch : System.Web.UI.Page
   {
       protected CrystalDecisions.Web.CrystalReportViewer CrystalReportViewer1;

       private void Page_Load(object sender, System.EventArgs e)
       {
           if(!Page.IsPostBack)
           {
               string SearchOption=Request.QueryString["soption"].ToString();
               string SearchWord=Request.QueryString["sword"].ToString();
               string gubun=Request.QueryString["gubun"].ToString();

               if(gubun=="1")
               {
                   ExportPDF(SearchOption,SearchWord);
               }
               else
               {
                   ExportExcel(SearchOption,SearchWord);
               }
           }
       }

       private string GetDBString()
       {
           return System.Configuration.ConfigurationSettings.AppSettings["DSN"].ToString();
       }

       private void ExportPDF(string SearchOption,string SearchWord)
       {
           ReportDocument crReportDocument = new ReportDocument();
           ExportOptions crExportOptions = new ExportOptions();
           DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions();

           SqlConnection conn = new SqlConnection(GetDBString());
           SqlCommand comm = new SqlCommand("up_searchword_export",conn);
           comm.CommandType = CommandType.StoredProcedure;

           SqlParameter param = new SqlParameter();
           param = comm.Parameters.Add("@searchoption", SqlDbType.VarChar,20);
           param.Direction = ParameterDirection.Input;
           param.Value = SearchOption.ToString();
           param = comm.Parameters.Add("@searchword", SqlDbType.VarChar,100);
           param.Direction = ParameterDirection.Input;
           param.Value = SearchWord.ToString();

           SqlDataAdapter adapter = new SqlDataAdapter(comm);
           dsDictionary ds = new dsDictionary();
           adapter.Fill(ds, "up_searchword_export");
           crReportDocument = new rptSearchWordPDF();
           crReportDocument.SetDataSource(ds);

           CrystalReportViewer1.ReportSource = crReportDocument;
           CrystalReportViewer1.SeparatePages = false;
           CrystalReportViewer1.DisplayGroupTree = false;
           CrystalReportViewer1.DisplayToolbar = false;

           string ExportRoot = System.Configuration.ConfigurationSettings.AppSettings["ExportRoot"];
           string Fname = ExportRoot+Session.SessionID.ToString()+".pdf";
           crDiskFileDestinationOptions.DiskFileName = Fname;
           crExportOptions = crReportDocument.ExportOptions;

           crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
           crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
           crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
           crReportDocument.Export();

           //Response.ClearContent();
           //Response.ClearHeaders();
           Response.ContentType = "application/pdf";
           Response.WriteFile(Fname);
           Response.Flush();
           Response.Close();

           System.IO.File.Delete(Fname);
       }

       private void ExportExcel(string SearchOption,string SearchWord)
       {
           ReportDocument crReportDocument = new ReportDocument();
           ExportOptions crExportOptions = new ExportOptions();
           DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions();

           SqlConnection conn = new SqlConnection(GetDBString());
           SqlCommand comm = new SqlCommand("up_searchword_export",conn);
           comm.CommandType = CommandType.StoredProcedure;

           SqlParameter param = new SqlParameter();        
           param = comm.Parameters.Add("@searchoption", SqlDbType.VarChar,20);
           param.Direction = ParameterDirection.Input;
           param.Value = SearchOption.ToString();
           param = comm.Parameters.Add("@searchword", SqlDbType.VarChar,100);
           param.Direction = ParameterDirection.Input;
           param.Value = SearchWord.ToString();

           SqlDataAdapter adapter = new SqlDataAdapter(comm);
           dsDictionary ds = new dsDictionary();
           adapter.Fill(ds, "up_searchword_export");

           crReportDocument = new rptSearchWordExcel();
           crReportDocument.SetDataSource(ds);

           CrystalReportViewer1.ReportSource = crReportDocument;
           CrystalReportViewer1.SeparatePages = false;
           CrystalReportViewer1.DisplayGroupTree = false;
           CrystalReportViewer1.DisplayToolbar = false;

           string ExportRoot = System.Configuration.ConfigurationSettings.AppSettings["ExportRoot"];
           string Fname = ExportRoot+Session.SessionID.ToString()+".xls";
           crDiskFileDestinationOptions.DiskFileName = Fname;
           crExportOptions = crReportDocument.ExportOptions;
           crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
           crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
           crExportOptions.ExportFormatType = ExportFormatType.Excel;
           crReportDocument.Export();

           Response.ClearContent();
           Response.ClearHeaders();
           Response.ContentType = "application/vnd.ms-excel";
           Response.WriteFile(Fname);
           Response.Flush();
           Response.Close();

           System.IO.File.Delete(Fname);
       }

       #region Web Form 디자이너에서 생성한 코드
       override protected void OnInit(EventArgs e)
       {
           InitializeComponent();
           base.OnInit(e);
       }
 
       private void InitializeComponent()
       {    
           this.Load += new System.EventHandler(this.Page_Load);
       }
       #endregion
   }
}

출처 : http://cafe.naver.com/82csharp/17

크리스탈 레포트 프로그램에서
메뉴 중 파일 > 프린터 설정 > 방향에서 '가로'를 선택하면 디자인 모습이 가로로 변경된다.

<.NET Source측 제어>
using CrystalDecisions.Shared;    //NameSpace
report.PrintOptions.PaperOrientation = PaperOrientation.Landscape;

* 이래도 안돼면....
프린터 출력하기 직전에 나오는 옵션창의 '기본 설정'에서 용지의 출력방향을 '가로'로 해 주면 된다....^^;;

Crystal Report v10사용시 자동으로 가로출력하기
<출처: 데브피아>

Crystal Report V10을 ASP.Net에서 사용할때 Viewer의 출력버튼을 클릭하였을때 출력 다이얼로그 창이 뜨고 인쇄옵션에서 "가로"항목을 체크해야지만 가로로 출력이 되는데. 인쇄옵션에서 인쇄방향에 대한 항목을 체크하지 않고 자동으로 rpt파일이 출력형태에 따라 가로이면 가로로 세로형태이면 세로에 체크되게.. 즉 그냥 출력 다이얼로그창에서 인쇄버튼만 누르면 해당하는 방향으로 출력하게 해주는 방법입니다.
소스상에서 PaperOrientation.Landscape를 설정하지 않아도 됩니다.

<방법>

우선 크리스탈 레포트 설치시  생성되는 폴더 중에 아래와 같은 경로에
http://pds5.devpia.com/aspnet_lec/1000/564/http://pds5.devpia.com/aspnet_lec/1000/564/crystalprinthost.html이라는 파일의 내용을 일부 수정해주면 됩니다. (수정내용은 첨부된 파일을 살펴보시기 바랍니다.)

경로: C:\Program Files\Common Files\Crystal Decisions\2.5\crystalreportviewers10\html

내용은 다음과 같습니다.

Viewer에서 출력버튼을 클릭하면 http://pds5.devpia.com/aspnet_lec/1000/564/http://pds5.devpia.com/aspnet_lec/1000/564/crystalprinthost.html파일이 ShowModal로 뜨게됩니다.
이때 Viewer페이지에서 rpt파일의 출력정보를 넘겨주는데. http://pds5.devpia.com/aspnet_lec/1000/564/http://pds5.devpia.com/aspnet_lec/1000/564/crystalprinthost.html파일 소스를 확인하니 window.dialogArguments.pageorientation값을 받아서 출력 다이얼로그 창의 가로 출력여부를 설정하는것으로 보입니다.

근데 문제는 Viewer페이지에서 가로출력에 대한 값을 window.dialogArguments.pageorientation변수가 아닌 window.dialogArguments.paperorientation이라는 변수로 넘겨주고 있습니다.값은 rpt 파일을 작성할때 설정(가로출력)을 가져오는듯한데 'Landscape'인것을 확인하였습니다. 하여 첨부한 파일의 소스를 확인하시면 아시겠지만 약간의 소스를 추가하였습니다.  또한 window.dialogArguments.usedefprinter값을 받는 if문은 막아야지 출력 다이얼로그 창에서 유저가 가로출력을 설정하지 않아도 가로로 출력이 가능하게 됩니다.

- IIS Version 5 사용시
기본적으로 .NET Framework은 ASP.NET 계정으로 작동을 합니다.
ASP.NET계정에 레지스터리 관련 권한이 없습니다.
.Net Framework 1.0과 1.1의 Machine.config 파일에서
( 파일위치 :
winnt\Microsoft.NET\Framework\v1.0.3705
winnt\Microsoft.NET\Framework\v1.1.4322 )


userName="SYSTEM"
password="AutoGenerate" logLevel="Errors" clientConnectedCheck="0:00:05" comAuthenticationLevel="Connect" comImpersonationLevel="Impersonate" responseDeadlockInterval="00:03:00" maxWorkerThreads="20" maxIoThreads="20"/>

userName="SYSTEM" 으로 수정해 주시면 됩니다.
기본값은 machine입니다.


- IIS Version 6 사용시
IIS관리자를 실행.
DEXTUploadPool이란 응용 프로그램 풀을 생성 한후 이 풀의 등록정보->ID 미리 정의된 보안계정을 로컬 시스템으로 지정.
웹사이트 전체의 응용 프로그램 풀을 DEXTUploadPool로 지정.
또는 DEXTUpload.NET을 사용하는 디렉토리를 가상디렉토리로 지정 한후 여기서 DEXTUploadPool로 지정.

DEXTUpload.NET.dll 컴포넌트는 COM+상에서 동작하므로, 구성요소 서비스에 등록되어야 합니다. Regsvcs.exe를 이용하여 등록하시면 됩니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
DEXTUpload.NET 3.0.3
DEXTUpload.NET Professional 3.5.0
· crdb_odbc.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· crdb_dao.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

· crdb_ado.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· Implode.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· sscsdk80.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u25samp1.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u25dts.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u252000.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u2lfinra.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

· u2lexch.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

· u2ldts.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u2lcom.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· u2l2000.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· ufmanager.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· crtowords_en.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

· MSVCRT.DLL : {WinSysDir}

­· craxdrt.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일,Server 등록

· crviewer.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일,Server 등록

· cxlibw-1-6.dll : {WinSysDir}

­· etc-1-0-12-1.dll : {WinSysDir}

­· Emfgen.dll : {CommonFiles}\Crystal Decisions\2.5\bin, 공유 화일

­· msvcp60.dll : {WinSysDir}, 공유 화일

­· crqe.dll : {WinSysDir}, Server 등록

레지스트리: HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.0\Crystal Reports,CommonFiles,문자열 값,c:\\program files\\common files\\crystal decisions\\2.5\\bin

대부분 다 정상적으로 등록이 될 것이다. 위의 dll은 크리스탈 레포트 10을 설치했다면

C:\Program Files\Common Files\Crystal Decisions\2.5\bin 폴더에 다 존재한다.

msvcp60.dll 같은 경우는 2000에서 없는 컴이 있더군요 이게 없음 crqe.dll 이 등록이 안됩니다.
cxlibw-1-6.dll, etc-1-0-12-1.dll 이녀석들이 없어도 안되구요. 이녀석들은 해당 개발 PC 윈도우 시스템 디렉토리에 있습니다
msvcp60.dll 도 역시 시스템 디렉토리에 있구요. 그리고 당연한거지만  cxlibw-1-6.dll, etc-1-0-12-1.dll, msvcp60.dll crqe.dll 은 같은 폴더에 있어야 crqe.dll이 등록이 되더군요. 이녀석이 등록 안되면 TLV 에러가 뜹니다.

비쥬얼 툴에 depends 툴을 이용해서 보면 etc-1-0-12-1.dll 이녀석은 의존성이 없던데요. 여기 질답글 보니까 이녀석도 있길래 혹시나 하고 넣었습니다. 레지스트리에는 위에 쓴 키값하고 밸류값을 넣어 주심 됩니다. 인스톨 팩토리에서 다 가능합니다. 마지막으로 저의 경우는 크리스탈 뷰어하고 TTX만 이용했습니다.크리스탈 리포트의 다른 객체 머 챠트라던가 그런 걸 쓰셨다면 더 많은 DLL이 필요 할겁니다. 2000 하고 2003에서는 잘 설치되고 잘 실행 됐습니다. xp하고 98은 아직 모르겠습니다만...

출 처 : 데브피아 http://www.devpia.com/forum/BoardView.aspx? no=182&ref=182&page=1&forumname=crystal_lec&stype=

+ Recent posts