'.NET'에 해당되는 글 38건

  1. 2010.04.02 SqlDataAdapter
  2. 2010.04.02 DataSet
  3. 2010.04.02 DataView
  4. 2010.04.02 SqlDataReader 1
  5. 2010.03.31 SqlParameter 클래스
  6. 2010.03.31 SqlCommand 클래스
  7. 2010.03.31 Connetion
  8. 2010.03.31 어셈블리 동적 로딩
  9. 2010.03.29 Const Vs Readonly
  10. 2010.03.29 Sealed
2010. 4. 2. 23:42

                                                                                  

 

DataAdapter의 기능

-     데이터베이스의 Connection으로부터 DataSet을 생성하는 중간 역할 담당

-        DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 SQL 명령 집합 및 데이터베이스 연결을 지원하는 클래스

-        DataTable와 같은 비연결 지향적 클래스들이 데이터베이스와 연결

 

-      Command로 작업할 때에는 데이터베이스와 연결된 상태에서 작업

-       DataAdapter로 작업을 할 경우에는 DataSet이라는 결과를 얻은 후에 데이터베이스와의 연결을 끊고, DataSet 자체만으로도 작업을 수행한다.

-       작업이 끝난 후에는 DatatAdapter를 통해 DataSet의 변경된 부분이 실제 데이터베이스에 반영 가능

 


 

 SelectCommand 속성

 

SelectCommand 속성을 이용하여 원본 DB의 데이터 소스에서 레코드를 검색하는데 사용하는 SQL문이나 Proc를 설정할 수 있다.

- SelectCommand 에 설정된 SQL문을 실행했을때 검색결과가 없어서 SelectCommamd가 행을 반환하지 않으면 데이터 셋에 테이블이 추가되지 않는다.

-    SelectCommand 문을 실행해서 나온 결과에 대해서 SqlDataAdapter클래스의 Fill메소드가 데이터 셋에 테이블을 추가하게 된다.

SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand();

adapter.SelectCommand.Connection = sConnection;

adapter.SelectCommand.CommandText = Query;




 
InsertCommand 속성

 

-    InsertCommand 속성을 이용하면 새로운 레코드를 데이터 소스에 삽입할 SQL 문이나 Proc를 설정할 수 있다.

-    InsertCommand를 이용해서 데이터 셋에 자료를 추가하는 등의 처리를 할 수 있다


adapter.InsertCommand = new SqlCommand();         

 adapter.InsertCommand.Connection = sConnection;

 adapter.InsertCommand.CommandText = Query;

adapter.InsertCommand.Parameters.Add("@name",SqlDbType.VarChar,10,"name");

adapter.Update(ds, "tb_insert");

 

DeleteCommad 속성

 

-   DeleteCommand는 행을 삭제할때 사용되는 속성이다.

-    DeleteCommand 속성을 이용해서 행(레코드)를 데이터 집합으로부터 삭제할 SQL 문이나 Proc를 가져오거나 설정할 수 있다.

adapter.DeleteCommand = new SqlCommand();

adapter.DeleteCommand.Connection=(SqlConnection)adapter.SelectCommand.Connection;

adapter.DeleteCommand = new SqlCommand();

adapter.DeleteCommand.CommandText = strUpdateQurey;

adapter.DeleteCommand.CommandType = CommandType.Text;

 

 UpdateCommand 속성

 

-    작업을 하다보면 여러가지 이유로 입력된 데이터를 수정해야 할 때가 있다.

-    UpdateCommand 속성을 이용하면 데이터 소스에서 레코드를 업데이트 하는데 사용하는 SQL 문이나 Proc를 가져오거나 설정할 수 있다

 

adapter.UpdateCommand = new SqlCommand();

adapter.UpdateCommand.Connection=(SqlConnection)adapter.SelectCommand.Connection;

adapter.UpdateCommand.CommandText = strUpdateQuery;

adapter.UpdateCommand.CommandType = CommandType.Text;

adapter.UpdateCommand.Parameters.Add(myParam);

 

메소드

설명

Fill

데이터 셋의 행을 데이터 소스와 일치하도록 한다.

FillSchema

데이터 셋에 DataTable을 추가하고 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

Update

데이터 셋과 동일하게 데이터 소스를 업데이트한다.

 

 예제코드

 

string connString = "server = 504-24\\SQL2005;database=tempdb;";

 connString = connString + "uid=Hello;password=dhtlak;";

 SqlConnection sConnection = new SqlConnection(connString);

  SqlDataAdapter adapter = new SqlDataAdapter();

  adapter.SelectCommand = new SqlCommand();

  adapter.SelectCommand.Connection = sConnection;

   String Query = "select * from titile";

   adapter.SelectCommand.CommandText = Query;

   DataSet ds = new DataSet("Mytable");

    adapter.FillSchema(ds, SchemaType.Source, "titile");

    adapter.Fill(ds, "titile");

  DataRow[] r3 = ds.Tables["titile"].Select();

  foreach (DataRow ro in r3)

   {

          Console.WriteLine(ro["titile_id"].ToString() + ro["type"].ToString());

   }

 

 

'.NET > ADO.NET' 카테고리의 다른 글

DB에 이미지 저장 / 로드 하기  (0) 2010.06.18
DB모델링  (0) 2010.05.28
DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
Posted by 아몰라
2010. 4. 2. 20:44


DataSet -  여러개의 테이블로 구성되있다.



DataTable의 구성요소

DataRow(행에 대한 정보)
DataColumn(열에 대한 정보)
Constraint(값을 제어하는 규약)
DataRelation(두 테이블 간의 관계)



DataRelation(관계)

- DataColumn 개체를 통해 두 개의 DataTable 개체를 서로 연결하는데 사용

- 부모 및 자식 테이블의 일치하는 열 간에 관계가 만들어짐

- DataSet 내의 한 DataTable에서 다른 DataTable로 이동을 허용





또 다른 예제

static void Main(string[] args)
{
DataSet dataSet = new DataSet("MyData");
DataTable table = new DataTable("MyTable");
DataRow row;

table.Columns.Add("이름", typeof(string));       //컬럼 추가
table.Columns.Add("나이", typeof(int));
table.Columns.Add("학번", typeof(string));

 

//레코드 추가
row = table.NewRow();
row["이름"] = "천정민";
row["나이"] = 26;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "조아라";
row["나이"] = 23;
row["학번"] = "123456789";
table.Rows.Add(row);

row = table.NewRow();
row["이름"] = "안용준";
row["나이"] = 26;
row["학번"] = "987654321";
table.Rows.Add(row);

dataSet.Tables.Add(table);     //DataSet에 테이블 추가

 

//table 테이블 레코드 변경전

Console.WriteLine("table 테이블 레코드 변경전");
DataRow[] r = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " + ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//table 테이블 레코드변경
dataSet.Tables["MyTable"].Rows[0].Delete();           //테이블 삭제
dataSet.Tables["MyTable"].Rows[0].BeginEdit();        //수정시작
dataSet.Tables["MyTable"].Rows[0]["이름"] = "송창은";   //레코드 값 변경
dataSet.Tables["MyTable"].Rows[0].EndEdit();          //수정끝
dataSet.Tables["MyTable"].Rows[0].AcceptChanges();    //변경된 내용 실행

 

//table 레코드 값 얻어오기
Console.WriteLine("table 레코드 값 변경 후");
DataRow[] r2 = dataSet.Tables["MyTable"].Select();
foreach (DataRow ro in r2)
{
    Console.WriteLine("이름 : " + ro["이름"].ToString() + " 나이 : " +
ro["나이"].ToString() + " 학번 : " + ro["학번"].ToString());
}

Console.WriteLine();

 

//다른 테이블 생성 및 레코드 생성
DataTable OtherTable = new DataTable("OtherTable");
OtherTable.Columns.Add("학번", typeof(string));
OtherTable.Columns.Add("학년", typeof(int));

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 4;
OtherTable.Rows.Add(row);

row = OtherTable.NewRow();
row["학번"] = "123456789";
row["학년"] = 3;
OtherTable.Rows.Add(row);

dataSet.Tables.Add(OtherTable);     //DataSet 추가

 

//OtherTable 레코드 값 얻어오기
Console.WriteLine("OtherTable 레코드 값 출력");
DataRow[] or = dataSet.Tables["OtherTable"].Select();
foreach (DataRow dr in or)
{
    Console.WriteLine("학번 : " + dr[0].ToString() + " 학년 : " + dr[1].ToString());
}

Console.WriteLine();


//pk설정
dataSet.Tables["Mytable"].PrimaryKey = new DataColumn[] { dataSet.Tables["Mytable"].Columns["학번"] };

 

//Relation 설정
DataRelation rel = new DataRelation("Stu", dataSet.Tables["Mytable"].Columns["학번"], dataSet.Tables["OtherTable"].Columns["학번"]);
dataSet.Relations.Add(rel);

 

//Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 출력
Console.WriteLine("Relation 관계에서 부모에 해당하는 Row값으로 자식의 Row값을 검색");
DataRow[] childrow = dataSet.Tables["MyTable"].Rows[0].GetChildRows("Stu");
//부모테이블의 0번째 row를 관계맺은 컬럼을 자식테이블에서 찾아라
foreach (DataRow cr in childrow) //childrow에 있는 값을 DataRow형식으로 가지고 오겠다
{
    Console.WriteLine("학번 : " + cr[0].ToString() + " 학년 : " + cr[1].ToString());
}
Console.WriteLine();

 

//테이블 갯수 출력
Console.WriteLine("테이블 수 : " + dataSet.Tables.Count);

//테이블 명 출력
foreach (DataTable t in dataSet.Tables)
{
    Console.WriteLine("테이블 명 : " + t.ToString());
}
//Console.WriteLine("테이블 명 : " + dataSet.Tables[0]);
//Console.WriteLine("테이블 명 : " + dataSet.Tables[1]);

//컬럼 명 출력
Console.WriteLine("컬럼 명");
foreach (DataColumn dc in dataSet.Tables[0].Columns)
{
    Console.Write(dc.ColumnName + " ");
}
Console.WriteLine();
}

'.NET > ADO.NET' 카테고리의 다른 글

DB모델링  (0) 2010.05.28
SqlDataAdapter  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
Posted by 아몰라
2010. 4. 2. 20:21

DataView는 데이터 바인딩 응용 프로그램에서 자주 사용되는 기능으로, 이 기능을 사용하면 DataTable에 저장되어 있는 데이터에 대해 서로 다른 뷰를 만들 수 있습니다. DataView를 사용하여 테이블의 데이터를 다른 정렬 순서로 노출시킬 수 있으며, 행 상태에 따라 또는 필터 식을 기준으로 데이터를 필터링할 수 있습니다.

DataView에서는 원본 DataTable의 데이터에 대한 동적 뷰를 제공합니다. 따라서 변경이 발생할 경우 DataTable의 내용, 순서 및 멤버에 해당 변경 사항이 적용됩니다. 이 동작은 특정 필터 및/또는 정렬 순서에 따라 테이블에서 DataRow 배열을 반환하는 DataTableSelect 메서드와는 다릅니다. 이내용은 원본으로 사용하는 테이블의 변경 사항을 적용하기는 하지만 해당 멤버 및 순서는 정적으로 유지됩니다. DataView의 동적 기능은 데이터 바인딩 응용 프로그램에 사용하기에 아주 적합합니다.

DataView에서는 단일 데이터 집합에 대한 동적 뷰를 제공하는데 이 동적 뷰에는 데이터베이스 뷰와 매우 유사하게 여러 가지 정렬 및 필터링 기준을 적용할 수 있습니다. 그러나 데이터베이스 뷰와 달리 DataView는 테이블로 취급될 수 없고 조인된 테이블의 뷰도 제공할 수 없습니다. 또한 소스 테이블에 있는 열을 제외하거나 계산을 통해 만들어지는 열과 같이 소스 테이블에 없는 열을 추가할 수 없습니다.

DataViewManager를 사용하여 DataSet의 모든 테이블에 대한 뷰 설정을 관리할 수 있습니다.DataViewManager에서는 각 테이블에 대한 기본 뷰 설정을 관리할 수 있는 편리한 방법을 제공합니다. 컨트롤을 둘 이상의 DataSet 테이블에 바인딩할 때는 DataViewManager에 바인딩하는 것이 좋습니다.


예제 - msdn 참고

출처 :  ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ko/wd_adonet/html/0fe5dfa2-c1cd-435f-90b6-b4dd2e3ef34b.htm

'.NET > ADO.NET' 카테고리의 다른 글

SqlDataAdapter  (0) 2010.04.02
DataSet  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
SqlCommand 클래스  (0) 2010.03.31
Posted by 아몰라
2010. 4. 2. 19:12
SQlDataReader - SQL Server 데이터베이스 에서 데이터를 가져올수 있게 해주는 클래스



주요 메소드

Close - SqlDataReader 개체를 닫음
NextResult - SqlDataReader를 다음 결과로 이동한다.
Read - SqlDataReader를 다음 레코드로 이동한다.



 string connString = "server = 504-12\\SQL2005;database=tempdb;";

 connString = connString + "uid=Man;password=0000;";
 SqlConnection sConnection = new SqlConnection(connString);
 SqlCommand myCom = new SqlCommand(null, sConnection);

 myCom.Connection = sConnection;

 myCom.CommandText = "select * from j_table";
 myCom.Connection.Open();

SqlDataReader sdr  = myCom.ExecuteReader();

// SqlDataReader를 만들려면, 생성자를 직접 사용하지 않고 SqlCommand 개체의ExcuteReader 메서드를 호출해야 한다.

데이터 가져오는 방법1 - Item 속성 이용

            while (sdr.Read()) //다음 레코드가 없을때까지 계속 돌린다.
            {
                Console.Write("m_id : " + sdr["m_name"].ToString());
                Console.Write("   m_age : " + sdr["m_age"].ToString());
                Console.WriteLine();
            }

데이터 가져오는 방법2 - Get+ 데이터 이용 , 처리효율이 높다!

            while (sdr.Read()) //다음 레코드가 없을때까지 계속 돌린다.
            {
                Console.Write("m_id : " + sdr.GetString(0).ToString());
                Console.Write("   m_age : " + sdr.GetInt16(0).ToString());
                Console.WriteLine();
            }                       
            
            sdr.Close();   // SqlDataReader를 사용하고있으면 SqlConnection에서 다른 작업을 할 수 없으므로 Close메소드를 호출해준다.

            myCom.CommandText = "select count(*) from j_table";
            Console.WriteLine("count : " + myCom.ExecuteScalar().ToString());  //쿼리를 실행한 결과를 반환
            myCom.Connection.Close();

'.NET > ADO.NET' 카테고리의 다른 글

DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
SqlCommand 클래스  (0) 2010.03.31
Connetion  (0) 2010.03.31
Posted by 아몰라

'.NET > ADO.NET' 카테고리의 다른 글

DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlCommand 클래스  (0) 2010.03.31
Connetion  (0) 2010.03.31
Posted by 아몰라
2010. 3. 31. 21:49
- 쿼리를 실행하는 작업을 할 때 사용한다. DB와 관련된 실제적인 데이터 처리를 한다.


SqlCommand 클래스 주요 속성

 CommandText
n 데이터 소스에서 실행할 SQL 문이나 저장 프로시저를 가져오거나 설정

CommandType
n CommandText 속성이 해석될 방법을 나타내는 값을 가져오거나 설정
Connection
n SqlCommand 인스턴스에서 사용하는 SqlConnection 가져오거나 설정

Parameters
 
n SqlParameterCollection 가져옴
 Transaction
n SqlCommand 실행하는 트랜잭션을 가져오거나 설정


 

SqlCommand 클래스 주요 메소드

ExecuteNonQuery()
n Connection 대한 SQL 문을 실행하고 영향을 받는 행 의 개수를 반환
ExecuteReader()
n CommandText Connection 보내고, SqlDataReader 생성
ExecuteScalar()
n 쿼리를 실행하고 쿼리에서 반환된 결과 집 합의 첫번째 행의 첫번째 반환
ExecuteXmlReader()
n CommandText Connection 보내고, XmlReader 객체를 생성



namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {           
            string connString = "server = 504-12\\SQL2005;database=tempdb;"; //서버의와 데이터베이스를 선택한다.
            connString = connString + "uid=Man;password=0000;";   //아이디와 패스워드를 적는다.
            SqlConnection con = new SqlConnection(connString);   //인자로 connectstring을 넣어서 DB를 셋팅해준다.

            con.Open();  //DB 에 접속한다.
            
            SqlCommand  mycon = new SqlCommand();  // Command 클래스 객체를만들어준다.
            mycon.Connection = con;  //접속된 DB의 인스턴스를 가져온다.

            mycon.CommandText ="insert  j_table(m_name, m_age)values ('성진용','26')";
            //데이터를 가져오거나 설정해준다.
            mycon.ExecuteNonQuery();

            con.Close(); 

        }
    }
}


속성들의 사용예제






출처 : http://www.cyworld.com/shiyp1/


'.NET > ADO.NET' 카테고리의 다른 글

DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
Connetion  (0) 2010.03.31
Posted by 아몰라
2010. 3. 31. 19:08

Connection 클래스

Connection 클래스는 DB와 연결할 수 있도록 해주는 가장 기본이 되는 클래스이다.


SqlConnection 클래스

SqlConnection 클래스는 MS SQL서버 전용
   - 속도가 빠르다

 

Public 속성

설명

ConnectionString

SQL 서버를 여는데 사용되는 문자열

ConnectionTimeOut

DB에 접근을 시도하고 오류를 생성하기 전에 연결하려는 동안 대기하는 시간

Container(컴포넌트에 상속)

컴포넌트가 포함된 IContainer

Database

DB의 이름

DataSource

SQL 서버의 인스턴스 이름

PacketSize

SQL 서버의 인스턴스와 통신하는데 사용할 네트워크 패킷의 크기를 바이트 단위로 가져옴

ServerVersion

클라이언트가 연결된 SQL 서버 인스턴스의 버전을 포함한 문자열

Site(컴포넌트에 상속)

Component ISite

State

현재의 연결 상태

WorkStationId

DB 클라이언트를 식별하는 문자열

 

Protected 속성

설명

DesignMode(컴포넌트에 상속)

컴포넌트가 현재 디자인 모드인지 여부를 나타내는 값을 가져옴

Events(컴포넌트에서 상속)

컴포넌트에 연결된 이벤트 핸들러의 목록을 가져옴

 

Public 메소드

설명

BeginTransaction

DB의 트랜잭션을 시작한다

ChangeDataBase

DB 이름을 변경한다

Close

DB 연결을 종료한다

CreateCommand

SqlCommand 개체를 만든다

CreateObjRef

 

원격 개체와 통신하는데 사용되는 프록시 생성에 필요한 모든 관련 정보가 들어있는 개체를 만든다 (MarshalByRefObject에서 상속)

Dispose

컴포넌트에서 사용하는 리소스를 해제한다

Equals

두 개의 오브젝트 인스턴스가 같은지 여부를 확인한다

GetHashCode

특정 형식에 대한 해시 함수로 사용된다

GetLifetimeService

인스턴스의 수명정책을 제어하는 현재의 수명 서비스 개체를 검색한다(MarshalByRefObject에서 상속)

GetType

인스턴스의 타입을 가져온다

InitializeLifeTimeService

인스턴스의 수명정책을 제어하기 위한 수명 서비스 개체를 가져온다

(MarshalByRefObject에서 상속)

Open

연결문자열에 의해 지정된 속성설정으로 DB에 연결한다

ToString

현재 오브젝트를 나타내는 문자열을 반환한다

 



OleDbConnection 클래스

OleDbConnection 클래스는 오라클, 엑세스등
  - 다른 DBMS의 경우 활용



MS SQl 서버로 접속해보자.


먼저  Connection String에 데이터를 넣는다.

string connString = "server=504-12\\SQL2005;database=tempdb;";    //해당서버이름과 데이터베이스명
            connString = connString + "uid=Myworld;password=myworld;"; //아이디와 패스워드
            connString = connString + "Connect Timeout=30";   //ConnectionTimeout 설정 30초
                        
Connection String을 연결 클래스에 인자로 넣어준다.
            SqlConnection sConn = new SqlConnection(connString);   //DB접속 셋팅


Open함수로 연결문자열에 의해 지정된 속성설정으로 DB에 접속한다.
            try
            {
                sConn.Open();
                Response.Write("<br>Myworld에 정상적으로 연결되었습니다");
            }
            catch(Exception ex)
            {
                Response.Write("<br>연결 오류");  

//Response 이 개체를 사용하면 클라이언트에 HTTP 응답 데이터를 보내고 이 응답에 대한 정보를 포함할 수 있다. 

                Response.Write("오류내용 : " + ex.ToString());
            }
            finally
            {
                if(sConn != null)
                    sConn.Close();
            }



추가!!

계정생성시 데이터베이스의 상태

고정 서버 역할

설명

bulkadmin

BULK INSERT 문을 실행할 수 있음

dbcreator

데이터베이스를 생성, 변경, 삭제, 복원할 수 있음

diskadmin

디스크 파일을 관리할 수 있음

processadmin

SQL Server의 인스턴스에서 실행되는 프로세스를 종료할 수 있음

securityadmin

로그인 및 해당 속성을 관리함. 서버 수준과 데이터베이스 수준의 사용권한을

부여(GRANT), 거부(DENY), 취소(REVOKE)할 수 있음

serveradmin

서버 차원의 구성 옵션을 변경하고 서버를 종료할 수 있음

setupadmin

연결된 서버를 추가하거나 제거하고 일부 시스템 저장프로시저를 실행할 수 있음

sysadmin

서버에서 모든 작업을 수행할 수 있음

 

 

고정 데이터베이스 역할

설명

db_accessadmin

Windows 로그인, Windows 그룹 및 SQL Server 로그인에 대한 액세스를 추가, 제거할 수 있음

db_backupoperator

데이터베이스를 백업할 수 있음

db_datareader

사용자 테이블의 모든 데이터를 읽을 수 있음

db_datawriter

사용자 테이블에서 데이터를 추가, 삭제, 변경할 수 있음

db_ddladmin

데이터베이스에서 모든 DDL(데이터 정의어) 명령을 실행할 수 있음

db_denydatareader

데이터베이스 내에 있는 사용자 테이블의 데이터를 읽을 수 없음

db_denydatawriter

데이터베이스 내의 사용자 테이블의 데이터를 추가, 수정, 삭제할 수 없음

db_owner

데이터베이스에서 모든 구성 및 유지 관리 작업을 수행할 수 있음

db_securityadmin

멤버 자격을 수정하고 사용권한을 관리할 수 있음

public

모든 데이터베이스 사용자에게 디폴트로 부여되는 최소 권한을 갖는 역할

'.NET > ADO.NET' 카테고리의 다른 글

DataSet  (0) 2010.04.02
DataView  (0) 2010.04.02
SqlDataReader  (1) 2010.04.02
SqlParameter 클래스  (0) 2010.03.31
SqlCommand 클래스  (0) 2010.03.31
Posted by 아몰라
2010. 3. 31. 10:45
리플렉션을 어설프게 이해해서 제대로 정리하지는못했다 -_-
다음에 더 정리가되면 다시 2탄을 올리도록하겠다.

1.
네임스페이스 리플렉션 ( System.Reflection ) 에 있는  Assembly 클래스를 이용한다.
 Assembly asm = Assembly.Load("SB");  SB.dll 파일을 로딩한다.

2.
해당 파일에 있는 네임스페이스명.클래스명을 불러온다.
Type type = asm.GetType("asem.SB");


아래와 같이해서 가져올 네임스페이스명과 클래스명을 알 수 있다.
foreach(Type i in asm.GetType())
{
Console.WriteLine(i.FullName)  
}

방법1

해당 클래스에서 프로퍼티를 가져온다.
해당 프로퍼티에서는 get으로 객체를 반환해준다.
GetValue를 통해 PropertyInfo에 있는 가져온 프로퍼티 값을 object에 넣어준다.

            PropertyInfo pi = type.GetProperty("sb");  
            object o = pi.GetValue(null, null); //첫번째 : obecjt  두번째 : 가져올 object의 인덱스
                                                           
이렇게 해서 해당 객체를 실행시킬 수 있다.

방법2

object obj = Activator.CreateInstance(stu, "진용", cnt++);  //해당겍체를 가져온다.
            MethodInfo mi =  stu.GetMethod("Study");          //클래스의 Study 메소드를 가져온다.
            mi.Invoke(obj, null);                                        //가져온 해당 객체를 실행시킨다.

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

윈도우 서비스 만들기  (0) 2010.04.04
ReadLine, Read, ReadKey  (0) 2010.04.03
Const Vs Readonly  (0) 2010.03.29
Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Posted by 아몰라
2010. 3. 29. 18:35

const vs readonly
readonly 키워드는 const 키워드와 다릅니다. const 필드는 필드를 선언할 때만 초기화될 수 있습니다. readonly 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있습니다. 따라서 readonly 필드의 값은 사용된 생성자에 따라 다릅니다. 또한 const 필드는 컴파일 타임 상수인 반면 readonly 필드는 다음 예제에서와 같이 런타임 상수로도 사용할 수 있습니다.
출처 : msdn.microsoft.com

컴파일 타임 상수 vs 런타임 상수

컴 파일 타임 상수는 코드가 컴파일될 때 계산되고 런타임 상수는 응용 프로그램이 실행되는 동안에만 계산됩니다. 컴파일 타임 상수는응용 프로그램 실행에 관계없이 항상 같은 값을 갖지만 런타임 상수는 매번 변경될 수 있습니다. 컴파일 타임 상수는 배열 범위,case 식 또는 열거자 이니셜라이저 등의 경우에 필요합니다.

출처 : msdn.microsoft.com

컴파일타임 상수는 런타임 상수에 비해 다소 빠르지만 유연성이 떨어진다. 컴파일 타임 상수는수행성능이 매우 중요하고 상수값이 절대로 바뀌지 않는 경우에 한해서만사용하는 것이 좋다.

컴 파일 타임 상수는 단지 내장자료형(정수형, 실수형) 이나 enum, string 에 대해서만 사용될수 있다. 이는 내장 자료형만이 유일하게 변수의 초기화 단계에서의 의미를 가지고 문자 자체로 표현되는 값(literal value)을 대체할 수 있기 때문이다.
출처 : Effective C#
 
장단점

readonly 대신 const 를 썼을 때의 유일한 장점은 수행성능이다. 이미 알려진 상수값에 직접 접근하는 효율이 readonly로 지정된 변수의 값을 참조하는 것에 비해서 조금 더 빠르다.그렇지만 이를 통해 얻을수 있는 수행성능의 개선효과가 작고 무엇보다 유연성을 감소시키는 단점이 있다. 유연성을 포기하기 이전에 수행성능에 미치는 영향을 먼저 명확하게 하자.
출처 : Effective C#

즉 const 로 선언한것은 변경을 하더라도 전체 컴파일 전까지는 반영된 내용이 적용되지 않습니다. 즉 const 로 선언한것을 수정할 경우는 재컴파일 하지 않고 배포한다면 원하는 결과는 나오지 않기 때문에 변경에 빈도가 있는 것은 const 를 사용하지 않는것이 좋습니다. 

역시 코드를 보는게 이해하기 쉽겠죠 ?? 밑에 내용은 msdn 에 있는 샘플 코드 입니다.







C# 언어 사양
10.4.2.2 상수 및 정적 읽기 전용 필드의 버전 관리

상 수와 읽기 전용 필드의 이진 버전 관리 의미는 다릅니다. 식에서 상수를 참조할 경우 컴파일 타임에 상수 값을 가져오지만, 식에서 읽기 전용 필드를 참조할 경우 런타임까지 필드 값을 가져오지 않습니다. 별개의 두 프로그램으로 구성된 응용 프로그램을 살펴보겠습니다.


using System;
namespace Program1
{
   public class Utils
   {
      public static readonly int X = 1;
   }
}
namespace Program2
{
   class Test
   {
      static void Main() {
         Console.WriteLine(Program1.Utils.X);
      }
   }
}

Program1Program2 네임스페이스는 별도로 컴파일된 두 프로그램을 나타냅니다. Program1.Utils.X를 정적 읽기 전용 필드로 선언했기 때문에 Console.WriteLine 문에서 출력하는 값을 컴파일 타임에 알 수 없으며, 런타임에 해당 값을 가져옵니다. 따라서 X 값이 변경되고 Program1이 다시 컴파일되면 Program2가 다시 컴파일되지 않더라도 Console.WriteLine 문이 새 값을 출력합니다. 그러나 X가 상수였기 때문에 Program2를 컴파일 할 때 X 값을 가져오며, Program2를 다시 컴파일할 때까지 Program1의 변경으로 인해 영향을 받지 않습니다.

출처 : msdn.microsoft.com
즉 program1 에 x 를 2로 변경후 Program1 만 컴파일 한다면 Program2 에서 찍어보는값은 변경이 적용된 값입니다. 
여기서 program1 에 x 값은 2로 변경한 값을 유지하고 Program3 을 추가하고 Program2 다음과 같이 변경했다고 가정해봅시다.
 
namespace Program3
{
   public class Utils
   {
      public const int X = 1;
   }
}

namespace Program2
{
   class Test
   {
      static void Main() {
         Console.WriteLine(Program1.Utils.X);
         Console.WriteLine(Program3.Utils.X);

      }
   }
}
이 코드에 결과는 2,1 입니다. 두번째 Program3.Utils.X 값을 2로 변경하고 Program1 과 Program3를 컴파일해서 돌린다면 결과는 2,1 입니다. Program2 를 컴파일 하기 전까지 const 값은 변경된 내용이 반영되지 않습니다.

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

ReadLine, Read, ReadKey  (0) 2010.04.03
어셈블리 동적 로딩  (0) 2010.03.31
Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
Posted by 아몰라
2010. 3. 29. 15:37

using System;
using System.Collections.Generic;
using System.Text;

namespace ClassTest4
{
    class AB
    {
        public virtual void ABC()
        {
            Console.WriteLine("A-ABC");
        }
        public virtual void Display()
        {
            Console.WriteLine("A-Display");
        }
        public virtual void Output()
        {
            Console.WriteLine("A-Output");
        }
    }
    class A:AB {
        public sealed override void ABC() {
            Console.WriteLine("A-ABC");
        }
        public override void Display()
        {
            Console.WriteLine("A-Display");
        }
        public override void Output()
        {
            Console.WriteLine("A-Output");
        }
    }
    class B :A{
        /*    public override void ABC() {
                Console.WriteLine("B-ABC");
            } 위가 실드로 되어있어서 재정의 못함*/

        public override void Display() {
            Console.WriteLine("B-Display");
        }
    }

    class CTest
    {
        static void Main(string[] args)
        {
            A pA = new A();
            pA.ABC();pA.Display();pA.Output();
            pA = new B();
            pA.ABC();pA.Display();pA.Output();
        }
    }
}

n1. sealed 클래스
- sealed 클래스는 파생 클래스에서 사용할 없는 클래스 이다.
- sealed 클래스는 상속을 막는 클래스 이다.
- sealed 클래스는 보안 코드 설계 부분의 명확하게 하기 위해 사용
- sealed클래스는 상업적인 코드 내부구현이 복잡해 파생클래스에서
  오버라이드하면 문제가 발생할 가능성이 있는 코드를 사전에 차단할 용도로 사용
n2. sealed 메서드
- sealed 메서드는 파생 클래스에서 오버라이드 없다.
- sealed 메서드는 꼭 override 앞에서만 사용할 수 있다.
- 하지만 sealed를 쓰면 상속을 줄 수 없으므로 후위 클래스에서 재정의 할 수 없다.



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

어셈블리 동적 로딩  (0) 2010.03.31
Const Vs Readonly  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
직렬화  (0) 2010.03.27
Posted by 아몰라
이전버튼 1 2 3 4 이전버튼