Client에서 SPLM 라이선스 서버 변경시 세팅 법을 올립니다.

별 자료는 아니지만 혹여나 필요하신분이 있을까봐서 ^^;;

Intergraph SPLM 설정법이라 Intergraph 솔루션 전체에 해당되나, SPI 기준 입니다.

3, 4, 5 항목 건너띄기 하시면 Client 신규 라이선스 서버 설정법이 되겠습니다.

 

 

1. 일단 [시작]-[Intergraph SmartPlant License Manager]-[SmartPlant License Manger]를 실행

clip_image002

2. [Configure and Test]를 선택 후 <Select> 클릭

clip_image004

3. [Remove License Server for Client]를 선택 후 <Select> 클릭

- 기존 라이선스 정보 삭제

clip_image006

4. 기존 서버 IP 확인 후 <OK>

clip_image007clip_image009

5. <Close>

clip_image011

6. [Select License Server for Client] 선택 후 <Select> 클릭

clip_image013

7. 신규 라이선스 서버 정보 입력 후 <OK>

- IP

Or

- ServerName (내부망에서만 접근 가능)

clip_image014clip_image016

※ DNS세팅이 가능하시면 Spilic..Domain 이런식의 도메인을 권장합니다.

추후 라이선스 변경이 이루어져도 사용자측에서는 라이선스 서버정보 변경 작업을 안 하셔도 됩니다.

8. <Close>

clip_image017clip_image019

9. <Close>

clip_image021

10. <Close>

clip_image023

11. SPI 또는 Intergraph 관련 프로그램 실행 확인

 

출처 : 자작(userpark)

'Document' 카테고리의 다른 글

대한민국의 전화번호 체계  (0) 2011.05.16
헝가리안 표기법  (0) 2008.07.16
델파이 코딩 가이드  (0) 2008.07.16

사전에 Exchange Web Services Managed API(SDK)가 설치 되어져 있어야 하며

프로젝트 참조에 Microsoft.Exchange.WebServices (C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll)를 추가하시기 바랍니다.

using Microsoft.Exchange.WebServices.Data;

본 샘플은 제목만 읽어온것이며, 경우에 따라서는 메소드를 잘 활용하시면 여러가지 정보를 읽어 올 수 있습니다.

소스만 보셔도 쉽게 이해가 가능 할 실 겁니다.

[????] 된 부분은 사용자에 맞게 변경하시기 바랍니다.

Exchange 서버 버전은 2010 SP1입니다.

8라인에서 서버에 맞는 버전을 선택하여 주세요. (2010 SP1은 ExchangeVersion.Exchange2010_SP1)

16라인에서 1개만 가져올경우 샘플이며, 크기는 알아서 조절 하세요(new ItemView(1))

string strExchangeDomain = @"[Domain]"; //ex) userpark.net
string strExchangeServerName = string.Format("exchange.{0}", strExchangeDomain); // exchange.userpark.net
string strExchangeUserID = @"[UserID]"; //사용자 ID
string strExchangeUserPs = @"[Password]"; //사용자 Password
string strExchangeMail = string.Format("{0}@{1}", strExchangeUserID, strExchangeDomain);  //ex)userpark@userpark.net
string strExchangeEwsUrl = string.Format("{0}://{1}/EWS/Exchange.asmx", "https", strExchangeServerName);

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);

//두개중 하나 NetworkCredential 또는 WebCredentials
//service.Credentials = new System.Net.NetworkCredential(strExchangeUserID, strExchangeUserPs, strExchangeDomain);
service.Credentials = new WebCredentials(strExchangeUserID, strExchangeUserPs, strExchangeDomain);

service.Url = new Uri(strExchangeEwsUrl);

Microsoft.Exchange.WebServices.Data.FindItemsResults<Microsoft.Exchange.WebServices.Data.Item> findResults = service.FindItems(Microsoft.Exchange.WebServices.Data.WellKnownFolderName.Inbox, new ItemView(1));
foreach (Microsoft.Exchange.WebServices.Data.Item item in findResults.Items)
{
	//if (item.IsNew == true)  //읽지 않은 경우만 가져올 경우
	Console.WriteLine(item.Subject);
}

 

2012/06/25 - [자료실] - Microsoft Exchange Web Service Managed API SDK 1.2.1

출처 : 자작(userpark)

Microsoft Exchange 프로그램을 하기 위한 필수 SDK :  Exchange Web Services Managed API(SDK) 1.2.1

출처 : Microsoft

DataTable간 Join하는 방법입니다.
소스 보시면 쉽게 이해가 가능 하 실 겁니다.
DataGridView를 통해서 최종 결과를 뿌려줍니다.
UI디자인에서 미리 만들어 놓으시기 바랍니다.
그럼 소스는…
DataTable dtUser = new DataTable();
DataTable dtDept = new DataTable();
DataTable dtUserInfo = null;
DataRow drTemp;
//사용자 정보 테이블 - DataTable Column을 추가(Range)
dtUser.Columns.AddRange(new DataColumn[] { 
		new DataColumn {ColumnName = "no", Caption = "Increment", DataType = typeof(int), Unique = true, AutoIncrement = true}
		, new DataColumn {ColumnName = "user_id", Caption = "User ID", DataType = typeof(string), Unique = true, AllowDBNull = false}
		, new DataColumn {ColumnName = "user_name", Caption = "User Name", DataType = typeof(string), AllowDBNull = false}
		, new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), DefaultValue = -1}
		, new DataColumn {ColumnName = "is_use", Caption = "IS Use?", DataType = typeof(bool), DefaultValue = true}
	});

/*
 * BEGIN DataRow를 이용한 사용자 정보 추가
 * */
drTemp = dtUser.NewRow();
//AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여
drTemp["no"] = 1;
drTemp["user_id"] = "test1";
drTemp["user_name"] = "Tester 1";
drTemp["dept_no"] = 1;
drTemp["is_use"] = true;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test2";
drTemp["user_name"] = "Tester 2";
drTemp["dept_no"] = 100;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test3";
drTemp["user_name"] = "Tester 3";
drTemp["dept_no"] = 3;
drTemp["is_use"] = false;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test4";
drTemp["user_name"] = "Tester 4";
dtUser.Rows.Add(drTemp);
/*
 * END DataRow를 이용한 사용자 정보 추가
 * */

//부서 정보 테이블 - DataTable Column을 추가(Range)
dtDept.Columns.AddRange(new DataColumn[] {
		new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), Unique = true, AutoIncrement = true}
		, new DataColumn {ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true}
	});

/*
 * BEGIN DataRow를 이용한 부서 정보 추가
 * */
drTemp = dtDept.NewRow();
//AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여
drTemp["dept_no"] = 1;
drTemp["dept_name"] = "IT Team";
dtDept.Rows.Add(drTemp);

drTemp = dtDept.NewRow();
drTemp["dept_name"] = "Management Team";
dtDept.Rows.Add(drTemp);

drTemp = dtDept.NewRow();
drTemp["dept_name"] = "Project Management Team";
dtDept.Rows.Add(drTemp);
/*
 * END DataRow를 이용한 부서 정보 추가
 * */

/*
 * BEGIN JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정
 * */
//기존 사용자 정보 테이블 구조 및 스키마만 복사(데이터는 복사하지 않음)
dtUserInfo = dtUser.Clone();
//Join으로 추가할 부서 테이블에서 부서명에 해당되는 컬럼 추가
dtUserInfo.Columns.Add(new DataColumn { ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true });
//Join 성공 여부 컬럼 추가
dtUserInfo.Columns.Add("is_join_dept", typeof(bool));
/*
 * END JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정 
 * */

/*
 * BEGIN 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영
 * */
//var : Variable의 약자, C# 3.0부터 추가된 타입이 없는 변수, 초기에 대입되는 값에 의하여 변수의 형식이 결정 됨(int, string, double ... 등 활용 가능)
//      여기서는 IEnumerable타입으로 이용
var query =
			from u in dtUser.AsEnumerable()
			join d in dtDept.AsEnumerable()
				//on (int)o["area_index_no"] equals (int)(decimal)e["area_index_no"] into j
			on
				u["dept_no"] equals d["dept_no"]
			into j
			from jList in j.DefaultIfEmpty()
			select new
			{
				no = u["no"]
				,
				user_id = u["user_id"].ToString()
				,
				user_name = u["user_name"].ToString()
				,
				dept_no = u["dept_no"]
				,
				dept_name = (jList != null ? jList["dept_name"] : string.Empty)
				,
				is_use = Convert.ToBoolean(u["is_use"])
				,
				is_join_dept = (bool)(jList == null ? true : false)
			};

foreach (var v in query)
{
	drTemp = dtUserInfo.NewRow();
	drTemp.BeginEdit(); //생략가능
	drTemp["no"] = v.no;
	drTemp["user_id"] = v.user_id;
	drTemp["user_name"] = v.user_name;
	drTemp["dept_no"] = v.dept_no;
	drTemp["dept_name"] = v.dept_name;
	drTemp["is_use"] = v.is_use;
	drTemp["is_join_dept"] = v.is_join_dept;
	drTemp.EndEdit(); //생략가능
	dtUserInfo.Rows.Add(drTemp);
}
/*
 * END 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영
 * */

//DataGridView에 반영
dataGridView1.DataSource = dtUser;
dataGridView2.DataSource = dtDept;
dataGridView3.DataSource = dtUserInfo;

출처 : 자작(userpark)

여기 티스토리에 소스를 보여주는 플러그인을 설치하였다.

단 몇 일 밖에 안쓴

SyntaxHighlighter 2.0.278

에서

SyntaxHighlighter 3.0.83

로 업그레이드를 하였다.


업그레이드 후 장점은 솔직히 아직 모르겠다.

단점이 더 보이는건 왜일까...더 무거워진 느낌 ^^;;

몇일 더 써보고 2.X대 버전으로 내려가야 할지 다시 한번 생각해 봐야겠다.



설치 3.x 참고사이트 : http://newtype.pe.kr/432

설치 2.x 참고사이트 : http://leanu.tistory.com/294

'잡답' 카테고리의 다른 글

SpringNote 서비스 종료  (0) 2012.12.13
'나갈래' 외치는 고양이  (0) 2012.04.04
맘에 드는 게시판이 없는것 같다...  (3) 2009.01.06
강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13

그냥 설명은 무시하고 예제 소스로 그냥 진행합니다.

DataSet이 아닌 일반 DataTable을 이용하는 방법도 동일합니다.

 

DataSet 생성

DataSet ds = new DataSet();
DataRow dr = null;
DataTable dt01 = new DataTable();
dt01.TableName = "Test01";
dt01.Columns.AddRange(new DataColumn[] {
        new DataColumn { ColumnName ="no", Caption = "일련번호", DataType=typeof(int), DefaultValue = 0}
        , new DataColumn { ColumnName ="col", Caption = "컬럼명", DataType=typeof(string), DefaultValue = string.Empty}
        , new DataColumn { ColumnName ="val", Caption = "값", DataType=typeof(string), DefaultValue = string.Empty}
        , new DataColumn { ColumnName ="etc", Caption = "비고", DataType=typeof(string), DefaultValue = string.Empty}
    });
dr = dt01.NewRow();
dr["no"] = 1;
dr["col"] = "COL1";
dr["val"] = "A";
dr["etc"] = "비고1";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 2;
dr["col"] = "COL2";
dr["val"] = "B";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 3;
dr["col"] = "COL3";
dr["val"] = "C";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 4;
dr["col"] = "COL4";
dr["val"] = "D";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 5;
dr["col"] = "COL5";
dr["val"] = "가";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 6;
dr["col"] = "COL6";
dr["val"] = "나※";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 7;
dr["col"] = "COL7";
dr["val"] = "~!@#$%^&*()_+`-={}[]:\";'<>?,./|\\";
dt01.Rows.Add(dr);
dr = dt01.NewRow();
dr["no"] = 8;
dr["col"] = "COL8";

dt01.Rows.Add(dr);
dr = dt01.NewRow();
dt01.Rows.Add(dr);
 
 
DataTable dt02 = new DataTable();
dt02.TableName = "Test02";
dt02.Columns.AddRange(new DataColumn[] {
        new DataColumn { ColumnName ="no", Caption = "일련번호", DataType=typeof(int), AutoIncrement = true}
        , new DataColumn { ColumnName ="etc", Caption = "비고", DataType=typeof(string), DefaultValue = string.Empty}
    });
dr = dt02.NewRow();
dr["etc"] = "비고1";
dt02.Rows.Add(dr);
dr = dt02.NewRow();
dr["etc"] = "비고2";
dt02.Rows.Add(dr);
dr = dt02.NewRow();
dr["etc"] = "비고3";
dt02.Rows.Add(dr);
dr = dt02.NewRow();
dr["etc"] = "비고4";
dt02.Rows.Add(dr);
dr = dt02.NewRow();
dr["etc"] = "비고5";
dt02.Rows.Add(dr);
dr = dt02.NewRow();
dr["etc"] = "비고6";
dt02.Rows.Add(dr);
 
ds.Tables.Add(dt01);
ds.Tables.Add(dt02);

XML 파일로 저장

ds.WriteXmlSchema(@"c:\TestForDS.xsd");
ds.WriteXml(@"c:\TestForDS.xml");

 

XML Stream을 이용하여 String에 담기

System.IO.MemoryStream mStreamXSD = new System.IO.MemoryStream();
System.IO.MemoryStream mStreamXML = new System.IO.MemoryStream();
ds.WriteXmlSchema(mStreamXSD);
mStreamXSD.Seek(0, System.IO.SeekOrigin.Begin);
ds.WriteXml(mStreamXML);
mStreamXML.Seek(0, System.IO.SeekOrigin.Begin);
System.IO.StreamReader srXSD = new System.IO.StreamReader(mStreamXSD);
System.IO.StreamReader srXML = new System.IO.StreamReader(mStreamXML);
string strXSD = srXSD.ReadToEnd();
string strXML = srXML.ReadToEnd();

 

이 방법을 이용하여 Oracle Clob 저장 및 활용

 

=================================================================

참고(출력 파일)

XSD

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Test01">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="no" msdata:Caption="일련번호" type="xs:int" default="0" minOccurs="0" />
              <xs:element name="col" msdata:Caption="컬럼명" type="xs:string" default="" minOccurs="0" />
              <xs:element name="val" msdata:Caption="값" type="xs:string" default="" minOccurs="0" />
              <xs:element name="etc" msdata:Caption="비고" type="xs:string" default="" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Test02">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="no" msdata:AutoIncrement="true" msdata:Caption="일련번호" type="xs:int" minOccurs="0" />
              <xs:element name="etc" msdata:Caption="비고" type="xs:string" default="" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Test01>
    <no>1</no>
    <col>COL1</col>
    <val>A</val>
    <etc>비고1</etc>
  </Test01>
  <Test01>
    <no>2</no>
    <col>COL2</col>
    <val>B</val>
    <etc />
  </Test01>
  <Test01>
    <no>3</no>
    <col>COL3</col>
    <val>C</val>
    <etc />
  </Test01>
  <Test01>
    <no>4</no>
    <col>COL4</col>
    <val>D</val>
    <etc />
  </Test01>
  <Test01>
    <no>5</no>
    <col>COL5</col>
    <val>가</val>
    <etc />
  </Test01>
  <Test01>
    <no>6</no>
    <col>COL6</col>
    <val>나※</val>
    <etc />
  </Test01>
  <Test01>
    <no>7</no>
    <col>COL7</col>
    <val>~!@#$%^&amp;*()_+`-={}[]:";'&lt;&gt;?,./|\</val>
    <etc />
  </Test01>
  <Test01>
    <no>8</no>
    <col>COL8</col>
    <val />
    <etc />
  </Test01>
  <Test01>
    <no>0</no>
    <col />
    <val />
    <etc />
  </Test01>
  <Test02>
    <no>0</no>
    <etc>비고1</etc>
  </Test02>
  <Test02>
    <no>1</no>
    <etc>비고2</etc>
  </Test02>
  <Test02>
    <no>2</no>
    <etc>비고3</etc>
  </Test02>
  <Test02>
    <no>3</no>
    <etc>비고4</etc>
  </Test02>
  <Test02>
    <no>4</no>
    <etc>비고5</etc>
  </Test02>
  <Test02>
    <no>5</no>
    <etc>비고6</etc>
  </Test02>
</NewDataSet>

출처 : 자작(userpark)

출처 : http://blog.naver.com/lcg2004?Redirect=Log&logNo=60049785458

참고 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=117409&ref=117385

Writing to Oracle CLOB fields
using System.Data.OracleClient

만약 당신이 .NET 코더고 오라클을 갖다가 데이터베이스 작업을 한다면, 이번이 적절하게 사용할 수 있는 기회가 될 것이다.^^ 읽으면서 커멘트도 달아주기 바란다!

우리 현재 프로젝트에서 우리는 ASP.NET 1.1 애플리케이션으로부터 상당한 량의 텍스트를 오라클 CLOB 필드로 쓸 필요가 있다. 우리는 이제껏 표준 MS System.Data.OracleClient 라이브러리를 (더 작은 량의 데이터를 쓰기위해) 사용해왔고, 그것은 우리에게 아주 유용했다. 나는 오라클 ODP.NET과 같은 더 최신버전의 우수한 팩이 있더라도 다른 라이브러리 팩을 소개하고 싶지 않았다.

예전의 자바 프로젝트에서 나는 CLOB를 쓰고 읽는 작업을 해왔고, 또한 나는 당신이 일반 VARCHAR과 같은 필드를 핸들해야 했다는 것을 안다.

따라서 나는 자리잡고 앉아서 .NET 동적Help과 가능하다면 가능한 모든 인터넷을 뒤지기 시작했고, 그 결과 흥미로운 것이 있었고, 나는 세가지 각각 다른 방법을 발견했다. 두가지는 정말로 단순하고 하나는 그리 단순하지 않다. 희안한 것은 내가 두 옵션은 제대로 작동할 것이라고 생각하지 않고-그러나 내가 테스트 했을 때 제대로 작동했다.
나는 3가지 방법을 여기서 공개할 것이다. 그리고 바라건데 .NET과 Oracle로 지가 머하는가를 아는 누군가는 나를 불꽃으로 격추시킬 수 있길 바란다.(청출어람하길 바란다..)

이것을 테스트 하기위해, 나는 오라클에다가 단순한 테이블을 생성하고, 그 테이블은 2개의 필드로 구성되어있다; ID(INT)와 TEXT(CLOB). 바로 그거다. 나는 노트패드로 생성된 단순 텍스트 파일을 읽을 것이며, 그것은 499KB다.

주: 이것은 테스트코드일 뿐, 당신이 실무에서 하고 싶은 것과는 별개이다. 만약 이코드를 사용하고 싶다면, 적절한 에러나 예외, 핸들링 등을 추가하라.

그래서, OracleDataAdapter를 이용하는 첫번째 방법은 안돌아 갈 것이다.(내가 클래스 라이브러리 문서들을 이해한 기준에서는..). 그러나, 맞긴맞다.

public void writeDataWithDA()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String clob = sr.ReadToEnd();

           sr.Close();

 

           OracleDataAdapter da = new OracleDataAdapter(

               "SELECT ID, TEXT FROM CLOBTEST", ConnectionString);

           DataTable dt = new DataTable();

           // get the schema

           da.FillSchema(dt, SchemaType.Source);

 

           OracleCommandBuilder cb = new OracleCommandBuilder(da);

 

           int id = 2;

 

           // create a row containing the data

           DataRow row = dt.NewRow();

           row["ID"] = id;

           row["TEXT"] = clob;

           dt.Rows.Add(row);

 

           // update the table

           da.Update(dt);

}

두번째 방법은 OracleCommand 를 이용하는 것이며, 이것도 안돌아간다(내 생각엔). 근데 원래는 되는 방법이다.

public void writeDataWithCommand()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String tempBuff = sr.ReadToEnd();

           sr.Close();

           

           using(OracleConnection conn = new OracleConnection(ConnectionString))

           {

                      conn.Open();

                      Console.WriteLine("Connected...") ;

                      String strSQL = 

                          "INSERT INTO CLOBTEST (ID,TEXT) VALUES (1,:TEXT_DATA) ";

 

                      OracleParameter parmData = new OracleParameter();

                      parmData.Direction = ParameterDirection.Input;

                      parmData.OracleType = OracleType.Clob;

                      parmData.ParameterName = "TEXT_DATA";

                      parmData.Value = tempBuff;

 

                      OracleCommand cm = new OracleCommand();

                      cm.Connection = conn;

                      cm.Parameters.Add(parmData);

                      cm.CommandText = strSQL;

                      cm.ExecuteNonQuery();

 

                      conn.Close();

           }

 

           Console.WriteLine("Done!") ;

}

이제 세번째 방법이다. 이것은 .NET 클래스 라이브러리 문서가 기술한 C/BLOB 핸들링 방법이며, 임시 LOB 객체를 오라클에 생성한 다음, insert작업을 하기전에, 그 객체를 쓰므로써 핸들링하는 방법이다. 이것은 역시나 잘돌아간다, 근데 이 방법은 트랜젝션과 다른 부분간에 약간 더 많은 혼란을 겪어야 한다.

public void writeWithTempBlob()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String tempBuff = sr.ReadToEnd();

           sr.Close();

 

           using(OracleConnection conn = new OracleConnection(ConnectionString))

           {

                      conn.Open();

                      Console.WriteLine("Connected...") ;

                      OracleTransaction tx = conn.BeginTransaction();

 

                      OracleCommand tempcmd = conn.CreateCommand();

                      tempcmd.Transaction = tx;

                      tempcmd.CommandText = "declare xx clob; begin dbms_lob.createtemporary(xx, false, 0); :tempclob := xx; end;";

                      tempcmd.Parameters.Add(new OracleParameter("tempclob",

                                 OracleType.Clob)).Direction = ParameterDirection.Output;

                      tempcmd.ExecuteNonQuery();

 

                      //get the temp lob object

                      OracleLob tempLob = (OracleLob)tempcmd.Parameters[0].Value;

 

                      //transform into byte array

                      System.Text.Encoding enc = Encoding.Unicode;

                     //MUST be unicode encoded!

 

                      Byte[] b = enc.GetBytes(tempBuff);

 

                      tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);

                      tempLob.Write(b,0,b.Length);

                      tempLob.EndBatch();

 

                      OracleCommand cmd = conn.CreateCommand();

                      cmd.Transaction = tx;

                      cmd.CommandText = 

                          "INSERT INTO CLOBTEST (ID, TEXT) VALUES (:ID, :TEXT)";

                      cmd.Parameters.Add("ID", 3);

                      cmd.Parameters.Add("TEXT", OracleType.Clob).Value = tempLob;

                      //insert the temp lob

 

                      cmd.ExecuteNonQuery();

 

                      tx.Commit(); 

           }

           Console.WriteLine("Done!") ;

}

임시 CLOB에 write할려면 텍스트는 유니코드여야 한다. 안그러면 당신은 완전 많은 문자들이 쓰여진 것을 경험하게 될 것이니 주의하라.^^

다른 참고자료

출처 : http://www.oracleclub.com/article/55741

설명은 안 하겠습니다.

 

WITH t AS
( 
SELECT XMLTYPE('
<ROOT>
<META use="report">
<META-NAME>Type1</META-NAME>
<META-VALUE>REQ1</META-VALUE>
</META>
<META use="report">
<META-NAME>Type2</META-NAME> 
<META-VALUE>REQ3</META-VALUE> 
</META>
<META use="report">
<META-NAME>Type3</META-NAME>
<META-VALUE>REQ4</META-VALUE>
</META>
</ROOT>
') v 
FROM dual 
) 
SELECT ExtractValue(Value(p), '/META/META-VALUE') "META-VALUE"
  FROM t 
     , TABLE(XMLSequence(Extract(v, '/ROOT/META[@use="report"]'))) p 
 WHERE ExtractValue(Value(p), '/META/META-NAME') = 'Type1'
; 
 

FileInfo로 확인할수 없는 해당 파일을 이미 오픈되었는지 확인하는 소스입니다.

구글링 끝에 찾아 내었습니다.

참고하시기 바랍니다.

출처 : http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use

 

 

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;
    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
    if (stream != null)
        stream.Close();
    }
    //file is not locked
    return false;
}

 

   1:  protected virtual bool IsFileLocked(FileInfo file)
   2:  {
   3:      FileStream stream = null;
   4:      try
   5:      {
   6:          stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
   7:      }
   8:      catch (IOException)
   9:      {
  10:          //the file is unavailable because it is:
  11:          //still being written to
  12:          //or being processed by another thread
  13:          //or does not exist (has already been processed)
  14:          return true;
  15:      }
  16:      finally
  17:      {
  18:      if (stream != null)
  19:          stream.Close();
  20:      }
  21:      //file is not locked
  22:      return false;
  23:  }
 

 

 

  1. [실행] – gpedit.msc
  2. 로컬 그룹 정책 편집기에서 아래 그림 위치로 찾아 “암호는 복잡성을 만족해야 함” 설정을 “사용 안 함”으로 변경

 신기하고 재미있어서 그냥 올려봅니다. ㅎㅎ

출처 : http://news.ichannela.com/feed/main/movie/3/all/20120404/45272985/1

 

 

'잡답' 카테고리의 다른 글

SpringNote 서비스 종료  (0) 2012.12.13
SyntaxHighlighter 3.0.83 설치  (0) 2012.06.14
맘에 드는 게시판이 없는것 같다...  (3) 2009.01.06
강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13

 닷넷으로 오픈다이얼로그 박스를 이용한 다중 선택하여 1000개 이상의 파일을 가져오는 경우 XP에서 오류가 발생 되는걸 확인 (windows 7 64bit에서는 오류 없음)

그러나 델파이(정확히는  Lazarus)에서는 오류가 발생되지 않은것으로 보아 닷넷프레임워크나 CLR에서 오류가 발생되는것으로 판단되어 짐

역시 구글링으로 인한 해결 방법을 찾았으나 이것은 오류가 발생시 해당 폴더 전체 파일리스트를 가져오게끔 예외 처리를 하였음

그럼 소스 참고하시기 바랍니다.

 

출처 : http://stackoverflow.com/questions/2607596/how-get-file-names-using-openfiledialog-in-net-1000-file-multiselect

public static string[] GetFiles() 
   
{ 
       
string[] fileNames; 
       
OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
 
        openFileDialog1
.InitialDirectory = UniversalDataImporter.Properties.Settings.Default.openFilePath; 
        openFileDialog1
.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
        openFileDialog1
.FilterIndex = 2; 
        openFileDialog1
.RestoreDirectory = false; 
        openFileDialog1
.Multiselect = true; 
        openFileDialog1
.CheckFileExists = false; 
 
       
try 
       
{ 
           
DialogResult result = openFileDialog1.ShowDialog(); 
           
if (result == DialogResult.OK && openFileDialog1.FileNames.Count() <501 ) 
           
{ 
               
UniversalDataImporter.Properties.Settings.Default.openFilePath = 
                   
Path.GetDirectoryName(openFileDialog1.FileName); 
               
UniversalDataImporter.Properties.Settings.Default.Save(); 
               
return fileNames = openFileDialog1.FileNames; 
           
} 
           
else if (result == DialogResult.Cancel) 
           
{ 
               
return null; 
           
} 
           
else 
           
{ 
               
if (MessageBox.Show("Too many files were Selected. Would you like to import a folder instead?", 
                   
"Too many files...", MessageBoxButtons.YesNo) == DialogResult.Yes) 
               
{ 
                   
return fileNames = GetFilesInFolder(); 
               
} 
               
else 
               
{ 
                   
return null; 
               
} 
           
} 
       
} 
       
catch (Exception ex) 
       
{ 
           
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
           
return null; 
       
} 
   
} 
 
   
public static string[] GetFilesInFolder() 
   
{ 
 
       
FileInfo[] fileInfo; 
 
       
string pathName; 
       
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); 
 
        folderBrowserDialog
.RootFolder = System.Environment.SpecialFolder.Desktop; 
 
       
DialogResult results = folderBrowserDialog.ShowDialog(); 
 
       
if (results == DialogResult.OK) 
       
{ 
           
try 
           
{ 
                pathName
= folderBrowserDialog.SelectedPath; 
 
               
DirectoryInfo dir = new DirectoryInfo(pathName); 
               
if (dir.Exists) 
               
{ 
 
                    fileInfo
= dir.GetFiles(); 
 
                   
string[] fileNames = new string[fileInfo.Length]; 
 
                   
for (int i = 0; i < fileInfo.Length; i++)//this is shit 
                   
{ 
                        fileNames
[i] = fileInfo[i].FullName; 
                   
} 
 
                   
return fileNames; 
               
} 
               
else 
               
{ 
                   
return null; 
               
} 
 
 
           
} 
           
catch (Exception ex) 
           
{ 
               
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
               
return null; 
           
} 
 
       
} 
       
else if (results == DialogResult.Cancel)  
       
{ 
           
return null; 
       
} 
       
else { return null; } 
   
} 


 

이 글은 스프링노트에서 작성되었습니다.

가장 유명한 VCL, .Net 컴포넌트의 대명가(?)에서 현재 .Net버전의 무료 버전을 배포하고 있네요

종류는 많지는 않습니다 대략 60가지...

정품을 구매하지 않은 사용자가 기본 컴포넌트 대체할려고 하면 좋을 것 같습니다.

메뉴를 통해서 들어가볼려고했지만

어디에 위치한지 몰라 링크 걸어둡니다.

 

https://www.devexpress.com/Products/Free/NetOffer/

 

그럼, 필요하신 분은 잘 사용하시기 바랍니다.

이 글은 스프링노트에서 작성되었습니다.

 

이 글 작성 당시에는 무료 컴포넌트가 제공 되었으나, 지금 현재는 정품 트라이얼 버전 링크로 수정 되었습니다.

 

C#에서 현재 경로를 알아내는 방법은 여러가지가 있다.

1. System.Environment.CurrentDirectory

가장 쉽게 현재 실행 경로를 알아낼 수 있는 방법이다. 하지만 이 방법은 Register에 등록된 프로그램으로 실행되면 다른 값을 출력한다. 이때는 3번 Application.StartupPath를 이용해야 한다.

* 루트일 경우에는 ‘\’ 반환, 그 외의 경우에는 폴더명까지만 반환한다.

  • C:\
  • C:\TestFolder\MyApp


2. System.IO.Directory.GetCurrentDirectory()


1번과 동일하다.


3. Application.StartupPath

위의 Register에 등록되었을 때도 정상적으로 자신의 시작 경로를 반환한다. 하지만 이는 Window Forms를 사용할 때만 Application 클래스를 사용할 수 있기 때문에 Console 기반 혹은, 클래스 라이브러리 기반에서는 사용이 불가능하다.

Tip. Application.ExecutablePath
현재 실행된 어플리케이션의 실행 파일의 위치이다. C:\Test\App.exe 와 같이 출력된다. 이 정보는 현재 경로가 아니기 때문에 변경되지 않는다.

 

 출처 : http://pureholic.net/2010/04/how-to-kwow-startpath-in-csharp/

이 글은 스프링노트에서 작성되었습니다.

Form Style - fsStayOnTop 효과

 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)

<-> SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

 

출처 :  http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=41&indx=405581&keyword1=fsStayOnTop&keyword2=

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts