2016년 12월 29일 목요일

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀][ADO.NET]ODP.Net을 이용한 DataAdapter 예제

[ADO.NET]ODP.Net을 이용한 DataAdapter 예제
 
간단한 예제 입니다. 참고하세요~
 
Dim mydeptno, mydname As String<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Dim connectStr As String = "User Id=scott;Password=tiger;Data Source=onj"
Dim con As New OracleConnection(connectStr)
Dim objAdapter As OracleDataAdapter = New OracleDataAdapter()
objAdapter.SelectCommand = New OracleCommand("Select * from emp", con)
Dim objDataSet As DataSet = New DataSet("objDataSet")
objAdapter.Fill(objDataSet, "Emp")
Me.myDataGrid.SetDataBinding(objDataSet, "EMP")
con.Close()
con.Dispose()

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀][ADO.NET]ODP.Net을 이용한 Stored Function(저장함수) 호출예제

[ADO.NET]ODP.Net을 이용한 Stored Function(저장함수) 호출예제
 
 
using System; 
using System.Data; 
using Oracle.DataAccess; 
using Oracle.DataAccess.Client; 
using Oracle.DataAccess.Types; 

class Test 

static void Main() 

//get_dalary 
함수는 Oracle에 정의 되어 있는 Stored Function 입니다
//Empno
와 같은 사원번호를 입력 인자로 받아 그 사원의 급여를 돌려 줍니다

string str = "data source=onj;user id=scott; password=tiger"; 

OracleConnection Conn = new OracleConnection(str); 
OracleCommand command = new OracleCommand("get_salary", Conn); 
command.CommandType = CommandType.StoredProcedure; 

OracleParameter output = new OracleParameter("sal", OracleDbType.Int64); 
output.Direction = ParameterDirection.ReturnValue; 
command.Parameters.Add(output); 

OracleParameter input = new OracleParameter("p_id", OracleDbType.Int32); 
input.Direction = ParameterDirection.Input; 
input.Value = 7900; 
command.Parameters.Add(input); 

try 

Conn.Open(); 
command.ExecuteNonQuery(); 
Conn.Close(); 

Console.WriteLine("{0}", output.Value); 
Console.ReadLine(); 


catch(OracleException e) 

Console.WriteLine(e.Number); 
Console.WriteLine(e.Message); 
Console.WriteLine(); 




----------------------------------------
* Oracle Server에 작성된 Stored Function 
--------------------------------------------
create or replace function get_salary 
(p_id in number) 
return number 

is 
v_sal number; 
begin 

select sal 
into v_sal 
from emp 
where empno = p_id; 
return v_sal; 
end; 



*/

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀]C#4.0 DataAdapter, DataSet, DataTable 간단 예제(오라클 EMP 테이블)

참고하세요~
 
간단한 콘솔 애플리케이션 입니다.
 
 
using System;
using System.Data;
using System.Data.OleDb;
class DatasetExample
{
    public static void Main()
    {
        OLEDB();
    }

    public static void OLEDB()
    {
        //아래 Data Source는 oracle설치 폴더 network/admin/tnsnames.ora 파일에 있는 접속을 원하는 DB의 별명 입니다.,
        string cnString = @"Provider=MSDORA;data source=onj;User ID=scott;Password=tiger";
        OleDbConnection OleCn = new OleDbConnection(cnString);
        OleCn.Open();
        string sql = "SELECT * FROM emp";
        try
        {
            OleDbCommand OleCmd = new OleDbCommand(sql, OleCn);
            OleDbDataAdapter OleDa = new OleDbDataAdapter(OleCmd);
            DataSet ds = new DataSet();
            OleDa.Fill(ds, "EMP");
            OleCn.Close();
            DataTable dt = ds.Tables["EMP"];
            Console.Write("\n\n");
            foreach (DataColumn hdr in dt.Columns)
            {
                Console.Write("{0, -10}\t", hdr.ColumnName);
            }
            Console.WriteLine("\n---------------------------------------------------");

            foreach (DataRow dtr in dt.Rows)
            {
                foreach (DataColumn dtc in dt.Columns)
                {
                    Console.Write("{0, -10}", dtr[dtc.ColumnName].ToString().Trim());
                    Console.Write("\t");
                }
                Console.Write("\n");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e);
        }
    }
}
 
 
[결과]
 
d26-1.png
 

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀]간단한C# ADO.NET 샘플(오라클EMP테이블 로딩)

윈도우에서 폼 하나 적당히 만드시고 DataGridView추가 후 아래 소스 참조해서 코딩 하세요...
오라클 접속 정보는 적당히 수정(Data Source는 tnsnames.ora 파일에 저장된 alias 이름입니다)
 
using System.Data.OleDb;     //for OleDbConnection, OleDbCommand , etc
using System.Data;       //for DataSet
using System.Windows.Forms;  //DataGrid, Form
using System;                //for String
class GridForm : Form
{
 private DataGrid dataGrid1 ;
 public GridForm()
 {
  AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  ClientSize = new System.Drawing.Size(544, 342);
  Load += new System.EventHandler(this.Form1_Load);
  dataGrid1 = new DataGrid(); 
  dataGrid1.Name = "dataGrid1";
  dataGrid1.Size = new System.Drawing.Size(520, 312);
  Controls.Add(this.dataGrid1);      
 }
 OleDbConnection Conn;
 OleDbCommand myCommand; 
 DataSet myDataSet;
 OleDbDataAdapter myAdapter;
 private void Form1_Load(object sender, System.EventArgs e)
 {
  try 
  {
   //-------------------------------------------------------------------------------   
   //아래는 오라클용 접속 문자열, wink는 net service 이름
   //-------------------------------------------------------------------------------
   string ConStr = ("Provider=MSDAORA;data source=WINK;User ID=scott;Password=tiger"); 
   Conn = new OleDbConnection(ConStr);    
   Conn.Open();
   
   String sql = "select * from emp ";
   myCommand = new OleDbCommand(sql, Conn);
   
   myAdapter = new OleDbDataAdapter();
   myCommand.CommandType = CommandType.Text ;
   myAdapter.SelectCommand = myCommand;
   myDataSet = new DataSet();
   myAdapter.Fill(myDataSet, "emp");
   dataGrid1.DataSource = myDataSet;   
   dataGrid1.DataMember = "emp";
   
  }
  catch(Exception ex) 
  {    
   MessageBox.Show(ex.Message, "emp Table Loading");    
  }
  finally 
  {
   Conn.Close();
  }
 } 
}
class Displayform
{
 static void Main()
 {
  System.Windows.Forms.Application.Run(new GridForm());
 }
}

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀][ADO.NE강좌]닷넷 DataAdapter(OleDbDataAdapter , DataSet), FILL

[ADO.NE강좌]닷넷 DataAdapter(OleDbDataAdapter , DataSet), FILL
 
닷넷 ADO.NET의 DataAdapter 는 DataSet 및 데이터 소스를 연결시키는 역할을 하며 데이터를 검색하고 저장하는 데 사용 됩니다. DataAdapter 는 DataSet에 포함된 데이터를 변경하여 데이터 소스의 데이터와 일치하도록 하는 Fill과, 데이터 소스에 포함된 데이터를 변경하여 DataSet의 데이터와 일치하도록 하는 Update를 매핑하여 이러한 연결을 제공합니다.
 
SQL Server 데이터베이스에 연결하는 경우, SqlDataAdapter를 관련 SqlCommand 및 SqlConnection 개체와 함께 사용하여 전반적인 성능을 향상시킬 수 있습니다.
 
OLE DB 지원 데이터 소스의 경우, DataAdapter를 관련 OleDbCommand 및 OleDbConnection 개체와 함께 사용합니다.
 
ODBC 지원 데이터 소스의 경우, DataAdapter를 관련 OdbcCommand 및 OdbcConnection 개체와 함께 사용합니다.
 
Oracle 데이터베이스의 경우, DataAdapter를 관련 OracleCommand 및 OracleConnection 개체와 함께 사용합니다.
 
이상 네가지 모두, System.Data.Common 이름 공간에 있는 추상 클래스(Abstract Class) 'DbDataAdapter'를 구현 한 것이며,  이는 같은 이름 공간의 추상 클래스 'DataAdapter' 에서 상속을 받게 되고, 추상 클래스 'DataAdapter'는 'System.Data'에 있는 IDataAdapter를 구현 한 것 입니다.
DataReader는 데이터 베이스 커넥션(Connection)을 열어, SQL 명령을 실행하고, 레코드를 열람한 후에, 더 이상의 데이터 오퍼레이션이 필요치 않으면, 마침내, 연결을 닫는 식의 순차적인 형태로 설명 될 수 있습니다.
 
DataAdapter는 데이터 오퍼레이션(Data Operation)이 필요한 시점에서만 데이터베이스에 연결을 해서, 필요한 조작을 하고 오퍼레이션(Operation)이 끝나면, 연결을 바로 끊는 다는 점에서, 중요한 차이점이 있습니다. 따라서, 데이터베이스 서버(Database Server) 쪽의 자원을 필요할 때만 사용한다는 점과 일정한 시점에서 동일한 서버에 저장되어 있던 동일한 여러 개의 복사본을 여러 클라이언트에서 보고, 조작하고, 다시 저장 할 수 있게 할 수 있다는 점등의 메커니즘은 매우 유용하게 응용 되어질 수 있을 것입니다.
 
데이터베이스에서 많은 자원을 소비하는 일중 하나가 바로 Connection을 열어두는 일이다. 개별적인 연결 하나 하나마다 많은 자원이 소비되는데 연결 수를 최소화 할 수 있다면 최소한의 부하를 일으킬 수 있는 것인데 이런 개념에서 나온 것이 바로 DataAdapter와 DataSet 입니다
 
특이한 부분은 DataAdapter는 데이터베이스에 종속적 이지만 DataSet은 데이터베이스에 독립적인 객체라는 점 입니다. 각각의 Provider마다 개별적인 버전의 DataAdapter가 제공되어 데이터베이스와 DataSet사이에 중계자 역할을 담당하게 되겠지만 DataSet은 데이터베이스와는 독립적이기 때문에 여러가지 버전이 존재하지 않습니다. 이는 또 여러 종류의 이질적인 데이터베이스로부터 Data를 가져와서 하나의 DataSet으로 묶을 수 있다는 것 입니다.
 
DataAdapter는 클라이언트가 데이터베이스에서 추출한 데이터인 DataSet과, 원본을 가지고 있는 데이터베이스 사이에서 중개자 역할을 하면서, 데이터베이스 파일과 DataSet이라는, 두 가지의 다른 포맷을 상호 전환 해주고 있다고 볼 수 있습니다.
 
OleDbDataAdapter public sealed class OleDbDataAdapter : DbDataAdapter, 
 IDbDataAdapter, IDataAdapter, ICloneable
 
SqlDataAdapter public sealed class SqlDataAdapter : DbDataAdapter, 
 IDbDataAdapter, IDataAdapter, ICloneable
 
DbDataAdapter public abstract class DbDataAdapter : DataAdapter
DataAdapter public abstract class DataAdapter : Component, IDataAdapter
DataAdapter
DbDataAdapter
   SqlDataAdapter
   OleDbDataAdapter
   OdbcDataAdapter
 
1. OleDbDataAdapter 클래스
 
DataSet 을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결을 나타냅니다.
 
[OleDbDataAdapter Constructor]
 
OleDbDataAdapter() : OleDbDataAdapter 클래스의 새 인스턴스를 초기화합니다.
 
OleDbDataAdapter(OleDbCommand) : SelectCommand 속성으로서 지정된 OleDbCommand를 사용하여 OleDbDataAdapter 클래스의 새 인스턴스를 초기화합니다.
 
OleDbDataAdapter(String, OleDbConnection) : SelectCommand 를 사용하여 OleDbDataAdapter 클래스의 새 인스턴스를 초기화합니다.
 
OleDbDataAdapter(String, String) : SelectCommand 를 사용하여 OleDbDataAdapter 클래스의 새 인스턴스를 초기화합니다.
 
뒤의 두 컨스트럭터(Constructor)에서 인자로 받는 스트링은 OleDbCommand의 CommandType프로퍼티의 Text값을 갖는 string과, OleDbConnection 클래스의 프로퍼티(들)를 값으로 갖는 string입니다.
 
 
아래 예를 보도록 하죠.
 
 
public static OleDbDataAdapter CreateDataAdapter(
    OleDbConnection connection)
{
    string selectCommand = 
        "SELECT CustomerID, CompanyName FROM Customers";
    OleDbDataAdapter adapter = 
        new OleDbDataAdapter(selectCommand, connection);
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    // Create the Insert, Update and Delete commands.
    adapter.InsertCommand = new OleDbCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (?, ?)");
    adapter.UpdateCommand = new OleDbCommand(
        "UPDATE Customers SET CustomerID = ?, CompanyName = ? " +
        "WHERE CustomerID = ?");
    adapter.DeleteCommand = new OleDbCommand(
        "DELETE FROM Customers WHERE CustomerID = ?");
    // Create the parameters.
    adapter.InsertCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID");
    adapter.InsertCommand.Parameters.Add("@CompanyName", 
        OleDbType.VarChar, 40, "CompanyName");
    adapter.UpdateCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID");
    adapter.UpdateCommand.Parameters.Add("@CompanyName", 
        OleDbType.VarChar, 40, "CompanyName");
    adapter.UpdateCommand.Parameters.Add("@oldCustomerID", 
        OleDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;
    adapter.DeleteCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;
    return adapter;
}
 

[OleDbDataAdapter Public Property]
 
AcceptChangesDuringFill : 채우기 작업을 수행하는 동안 DataTable에 추가된 DataRow에 대해 AcceptChanges가 호출되는지 여부를 나타내는 값을 가져오거나 설정합니다.
 
DeleteCommand : 데이터 집합에서 레코드를 삭제하는 SQL 문이나 저장 프로시저를 가져오거나 설정합니다. 

public static OleDbDataAdapter CreateCustomerAdapter(
    OleDbConnection connection)
{
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
    OleDbCommand command;
    OleDbParameter parameter;
    // Create the SelectCommand.
    command = new OleDbCommand("SELECT CustomerID FROM Customers " +
        "WHERE Country = ? AND City = ?", connection);
    command.Parameters.Add("Country", OleDbType.VarChar, 15);
    command.Parameters.Add("City", OleDbType.VarChar, 15);
    dataAdapter.SelectCommand = command;
    // Create the DeleteCommand.
    command = new OleDbCommand(
        "DELETE * FROM Customers WHERE CustomerID = ?", 
        connection);
    parameter = command.Parameters.Add(
        "CustomerID", OleDbType.Char, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;
    dataAdapter.DeleteCommand = command;
    return dataAdapter;
}
 
InsertCommand : 데이터 소스에 새 레코드를 삽입하는 데 사용하는 SQL 문이나 저장 프로시저를 가져오거나 설정합니다.
 
FillCommandBehavior: 데이터 어댑터를 채우는 데 사용되는 명령의 동작을 가져오거나 설정합니다. (DbDataAdapter에서 상속됨) public enum CommandBehavior

Default : 쿼리는 여러 결과 집합을 반환할 수 있습니다. 쿼리를 실행하면 데이터베이스 상태에 영향을 미칠 수 있습니다. Default 는 CommandBehavior 플래그를 설정하지 않으므로 ExecuteReader(CommandBehavior.Default) 호출과 ExecuteReader() 호출은 기능적으로 동일합니다.
 
SingleResult : 쿼리는 단일 결과 집합을 반환합니다.
SchemaOnly : 쿼리에서 열 정보만 반환합니다. SchemaOnly 를 사용할 때 .NET Framework Data Provider for SQL Server에서는 실행되는 문 앞에 SET FMTONLY ON을 배치합니다.
KeyInfo : 쿼리는 열과 기본 키 정보를 반환
SingleRow : 쿼리가 첫 번째 결과 집합의 단일 행을 반환
CloseConnection : 명령을 실행하면 관련 Connection 개체는 관련 DataReader 개체가 닫힐 때 함께 닫힙니다.
 

FillLoadOption 어댑터가 DbDataReader에서 DataTable을 채우는 방법을 결정하는 LoadOption을 가져오거나 설정합니다. (DataAdapter에서 상속됨) # 아래는 .NET 2.0이상에서 지원 합니다. Load 또는 Load 메서드를 사용할 때 데이터 소스의 값이 기존 행에 적용되는 방식을 제어합니다.
 
public enum LoadOption
 
OverwriteChanges : 이 행의 들어오는 값이 각 열 데이터의 현재 값 및 원래 값 버전에 작성됩니다.
PreserveChanges : 이 행의 들어오는 값이 각 열의 원래 값 버전에 작성됩니다. 각 열 데이터의 현재 버전은 변경되지 않습니다. [This] 가 기본값입니다.
Upsert : 이 행의 들어오는 값이 각 열의 현재 버전에 작성됩니다. 각 열 데이터의 원래 버전은 변경되지 않습니다.

MissingMappingAction (DataAdapter 클래스에서 상속) : 들어오는 데이터와 일치하는 테이블이나 열이 없는 경우 수행할 동작을 결정합니다. 
 
// Assumes a valid connection string to an Access database.
static void CreateOleDbAdapter(string connectionString)
{
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand =
        new OleDbCommand("SELECT * FROM Categories ORDER BY CategoryID");
    adapter.SelectCommand.Connection =
        new OleDbConnection(connectionString);
    adapter.MissingMappingAction = MissingMappingAction.Error;
    adapter.MissingSchemaAction = MissingSchemaAction.Error;
}

MissingSchemaAction (DataAdapter 클래스에서 상속) : 기존 DataSet 스키마가 들어오는 데이터와 일치하지 않는 경우 수행할 동작을 결정.
 
SelectCommand : 데이터 소스의 레코드를 선택하는 데 사용하는 SQL 문이나 저장 프로시저를 가져오거나 설정합니다.
 

TableMappings (DataAdapter 클래스에서 상속) : 소스 테이블과 DataTable 사이에 마스터 매핑을 제공하는 컬렉션을 가져옵니다.TableMappingsCollection객체 발생. 
 
public void ShowTableMappings() {
   // ...
   // create myDataAdapter
   // ...
   myDataAdapter.TableMappings.Add("Categories","DataCategories");
   myDataAdapter.TableMappings.Add("Orders","DataOrders");
   myDataAdapter.TableMappings.Add("Products","DataProducts");
   string myMessage = "Table Mappings:\n";
   for(int i=0;i < myDataAdapter.TableMappings.Count;i++) {
      myMessage += i.ToString() + " "
         + myDataAdapter.TableMappings[i].ToString() + "\n";
   }
   MessageBox.Show(myMessage);
}
 
 
UpdateCommand :데이터 소스의 레코드를 업데이트하는 데 사용하는 SQL 문이나 저장 프로시저를 가져오거나 설정합니다. 

private static OleDbDataAdapter CreateCustomerAdapter(
    OleDbConnection connection)
{
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
    OleDbCommand command;
    OleDbParameter parameter;
    // Create the SelectCommand.
    command = new OleDbCommand("SELECT * FROM dbo.Customers " +
        "WHERE Country = ? AND City = ?", connection);
    command.Parameters.Add("Country", OleDbType.VarChar, 15);
    command.Parameters.Add("City", OleDbType.VarChar, 15);
    dataAdapter.SelectCommand = command;
    // Create the UpdateCommand.
    command = new OleDbCommand(
        "UPDATE dbo.Customers SET CustomerID = ?, CompanyName = ? " +
        "WHERE CustomerID = ?", connection);
    command.Parameters.Add(
        "CustomerID", OleDbType.Char, 5, "CustomerID");
    command.Parameters.Add(
        "CompanyName", OleDbType.VarChar, 40, "CompanyName");
    parameter = command.Parameters.Add(
        "oldCustomerID", OleDbType.Char, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;
    dataAdapter.UpdateCommand = command;
    return dataAdapter;
}
 
[OleDbDataAdapter Public Method]
 
Fill : DbDataAdapter에 구현되어 있는 Fill() 메쏘드의 인자와 더불어 ADO Recordset, 혹은 Record 객체를 인자로서 취할 수 있는 오버로드 된 형태로, DataSet에 자료를 채움. 
 
OleDbDataAdapter da=new OleDbDataAdapter();
OleDbDataSet ds=new OleDbDataSet();
OleDbCommand cmd=
new OleDbCommand("SELECT * FROM Name");
da.Fill(ds, "Name");
FillSchema (DbDataAdapter 클래스에서 상속) DataSet에서 한 DataTable의 스키마(Schema)를 만들어 이 스키마를 데이터 소스에 있는 스키마와 동기화 함. 
 
OleDbCommand cmd=
new OleDbCommand("SELECT * FROM aTable);
OleDbDataAdapter da=
new OleDbDataAdapter(cmd);
DataSet ds=new DataSet();
DataTable dt=
da.FillSchema(ds, SchemaType.Source);
 
 
public static DataSet GetCustomerData(string dataSetName,
    string connectionString)
{
    DataSet dataSet = new DataSet(dataSetName);
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT CustomerID, CompanyName, ContactName FROM dbo.Customers", connection);
        DataTableMapping mapping = adapter.TableMappings.Add("Table", "Customers");
        mapping.ColumnMappings.Add("CompanyName", "Name");
        mapping.ColumnMappings.Add("ContactName", "Contact");
        connection.Open();
        adapter.FillSchema(dataSet, SchemaType.Mapped);
        adapter.Fill(dataSet);
        return dataSet;
    }
}

GetFillParameters (DbDataAdapter 클래스에서 상속) : SQL SELECT 문을 실행할 때 사용자가 설정한 매개 변수를 가져옵니다. 
 
OnFillError : Fill 을 수행하는 동안 오류가 발생하면 호출됩니다. (DataAdapter에서 상속됨) 

[OleDbDataAdapter Events]
 
Disposed Dispose 메서드를 호출하여 구성 요소가 삭제되는 경우 발생합니다. (Component에서 상속됨)
FillError 채우기 작업 도중에 오류가 발생할 때 반환됩니다. (DataAdapter에서 상속됨)
RowUpdated 데이터 소스(Data Source)에 업데이트(Update)를 실행 할 경우 발생. (데이터 변경 전이라도 발생.)
RowUpdating 데이터 소스(Data Source)에 업데이트(Update)를 실행 할 경우 발생. (데이터 변경 후에만 발생.)

[예제]
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace ConsoleApplication4
{
    using System;
    using System.Data;
    using System.Data.OleDb;
    class DataAdapter1
    {
        static void Main()
        {
            OleDbConnection Cn = new OleDbConnection(@"Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger");
            OleDbDataAdapter da = new OleDbDataAdapter();
            da.SelectCommand = new OleDbCommand("select empno, ename, sal from emp", Cn);
            DataSet ds = new DataSet("myFirstDataSet");
            da.Fill(ds, "emp");
            foreach (DataRow r in ds.Tables[0].Rows)
            {
                Console.WriteLine("empno : {0} ", r["empno"]);
                Console.WriteLine("ename : {0} ", r["ename"]);
                Console.WriteLine("sal : {0} ", r["sal"]);
            }
        }
    }

}
 
[결과]
 
empno : 777
ename : 오라클자바
sal :
empno : 7369
ename : SMITH
sal : 800.00
empno : 7499
ename : ALLEN
sal : 1600.00
empno : 7521
................
................
................
 

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀][C#4.0 ADO.NET강좌]ADO.NET데이터조작, 명령객체, OleDbCommand 예제

[C#4.0 ADO.NET강좌]ADO.NET데이터조작, 명령객체, OleDbCommand 예제
 
아래의 예제는 ExecuteScalar를 이용하여 테이블 행의 개수를 가져오는 예제 입니다.
테이블 안의 행들의 개수를 알아 내는 것으로 ExecuteScalar()를 통해 select count(*) 질의를 수행 하는 것이 효율적 입니다.

[예제1]
 
Oracle scott 계정의 EMP 테이블 레코드 건수 리턴 …
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            OleDbConnection Cn = null;
            try
            {
                string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
                Cn = new OleDbConnection(conStr);
                OleDbCommand cmdSelect = new OleDbCommand("select count(*) from emp", Cn);
                Cn.Open();
                object count = cmdSelect.ExecuteScalar();
                Console.WriteLine("Count of Emp = {0}", count);
                Cn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                if (Cn.State == ConnectionState.Open)
                {
                    Cn.Close();
                }
            }
        }
    }
}

[결과]
Count of Emp = 15
 

아래 예제는 EMP TABLE에 대한  입력, 수정, 삭제 예제 입니다.

[예제2]
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace ConsoleApplication4
{
    using System;
    using System.Data;
    using System.Data.OleDb;
    class CommandExam
    {
        static OleDbConnection cn;
        public static void Main()
        {
            OleCn();
            Openning();
            Console.WriteLine("The Original Table");
            Output();
            Console.WriteLine("Added Table");
            Adding();
            Output();
            Console.WriteLine("Modified Table");
            Modifying();
            Output();
            Console.WriteLine("Deleted Table");
            Deleting();
            Output();
            Closing();
        }
        public static void OleCn()
        {
            //string OleCnString = @"Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
            string OleCnString = ("Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger");
            cn = new OleDbConnection(OleCnString);
        }
        public static void Openning()
        {
            cn.Open();
        }
        public static void Output()
        {
            string sql = "SELECT empno id, ename name FROM emp";
            OleDbCommand cmd;
            OleDbDataReader dr;
            cmd = new OleDbCommand(sql, cn);
            dr = cmd.ExecuteReader();
            Console.Write("\n");
            while (dr.Read())
            {
                Console.WriteLine("{0, -10}\t{1, -10}",
                    dr[0].ToString().Trim(),
                    dr[1].ToString().Trim());
            }
            Console.Write("\n");
            dr.Close();
        }
        public static void Adding()
        {
            try
            {
                string sqladd = "INSERT INTO emp (empno, ename) VALUES (888, '오?A라?o클¡þ자U바?U')";
                OleDbCommand cmdAdd = new OleDbCommand(sqladd, cn);
                int rowsadded = cmdAdd.ExecuteNonQuery();
                Console.WriteLine("Number of rows added: " + rowsadded);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        public static void Modifying()
        {
            try
            {
                string sqlmodify = "UPDATE emp SET ename = '오?A엔?¡?제|이I' WHERE empno = 888";
                OleDbCommand cmdupdate = new OleDbCommand(sqlmodify, cn);
                int rows = cmdupdate.ExecuteNonQuery();
                Console.WriteLine("Number of rows modified: " + rows);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        public static void Deleting()
        {
            try
            {
                string sqldelete = "DELETE FROM emp WHERE empno = 888 ";
                OleDbCommand cmddelete = new OleDbCommand(sqldelete, cn);
                int rows = cmddelete.ExecuteNonQuery();
                Console.WriteLine("Number of rows deleted: " + rows);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        public static void Closing()
        {
            cn.Close();
        }
    }
}
 

[닷넷교육,C#교육,실무교육학원추천_탑크리에듀][C#4.0 ADO.NET강좌]ADO.NET데이터조작, 명령객체, Command(OleDbCommand)클래스, 닷넷4.0, ADO.NET

[C#4.0 ADO.NET강좌]ADO.NET데이터조작, 명령객체, Command(OleDbCommand)클래스, 닷넷4.0, ADO.NET

Command (IDbCommand) 클래스
 
Command 클래스는 간단히 SQL 구문이나, 저장 프로시저(stored procedure)를 담는 것이라고 할 수 있으며, 연결이 되어 있는 데이터베이스 혹은 연결되지 않은 데이터베이스에서 모두 이용 될 수 있습니다. 각 데이터 제공자(Data Provider)의 Command Class들, 즉, OleDbCommand, SqlCommand등은 System.Data 이름 공간(Name Space)에 있는 IDbCommand를 구현 한 것입니다.
 
OleDbCommand public sealed class OleDbCommand : Component, ICloneable, IDbCommand
SqlCommand public sealed class SqlCommand : Component, IDbCommand, ICloneable
IDbCommand public interface IDbCommand
 
데이터 소스에 연결된 동안 실행되고 관계형 데이터베이스에 액세스하는 .NET Framework 데이터 공급자에 의해 구현되는 SQL 문을 나타냅니다.
 
OleDbCommand, SqlCommand와 같은 Command 클래스는 커넥션 클래스에서 지정된, 특정한 데이터 소스(Data Source)를 대상으로 원하는 명령어를 SQL문, 혹은 저장 프로시져(Stored Procedure)형태의 인자(Argument)를 받아 명령을 실행하는 역할을 합니다.
 
가장 널리 쓰이는 데이터 프로바이더 Sql, OLE용 Command (OleDbCommand와 SqlCommand)들 간의 차이는 거의 없지만, SqlCommand의 경우 OleDbCommand 클래스에서는 불가능한, XML 스트림(Stream)을 반환(return) 할 수 있다는 중요한 차이점이 있습니다.
 
1. OleDbCommand 클래스
 
OleDbCommand 클래스는 일반적으로 3 종류의 인자를 취해 인스턴스(Instance)를 생성 합니다.

[OleCommand Class Constructor]
 
public OleDbCommand() :  OleDbCommand 클래스의 새 인스턴스를 초기화합니다.
 
public OleDbCommand(string cmdString) : 쿼리 텍스트를 사용하여 OleDbCommand 클래스의 새 인스턴스를 초기화합니다.
 
public OleDbCommand(string cmdString) : 쿼리 텍스트와 OleDbConnection을 사용하여 OleDbCommand 클래스의 새 인스턴스를 초기화합니다.
 
public OleDbCommand(string cmdString, OleDbConnection cn, OleDbTransaction transaction) : 쿼리 텍스트, OleDbConnection 및 Transaction을 사용하여OleDbCommand 클래스의 새 인스턴스를 초기화합니다.
 
[OleDbCommand Public Properties]

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

   OleDbCommand command = new OleDbCommand();
   command.CommandText = "SELECT * FROM Emp";
   command.CommandTimeout = 20;
 
CommandTimeout : 명령 실행을 종료하고 오류를 생성하기 전에 대기 시간을 가져오거나 설정합니다. 기본값은30 sec.
 
CommandType : CommandText 속성을 해석하는 방법을 나타내는 값을 가져오거나 설정합니다. 기본값 : Text 
 
   OleDbCommand cmd=OleDbCommand("SP");
   cmd.CommandType=
   CommandType.StoredProcedure;
 
public enum CommandType

Text, StoredProcedure, TableDirect 새개의 값

Connection : OleDbCommand 의 이 인스턴스에서 사용되는 OleDbConnection을 가져오거나 설정합니다. 
 
string queryString = "SELECT * FROM Emp";
   OleDbCommand command = new OleDbCommand(queryString);
   command.Connection = new OleDbConnection
      ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND_RW.MDB");
   command.CommandTimeout = 20;
DesignTimeVisible Customized Windows Forms Designer에서 보여져야 하는지를 지정
Parameters SQL문이나 저장 프로시져문에서 매개변수(Parameter) 지정. OleDbParameterCollection 을 가져옵니다. OleDbCommand command = new OleDbCommand(queryString, connection);
    command.CommandText = 
        "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?";
    command.Parameters.Add(parameters);
Transaction OleDbCommand 가 실행되는 OleDbTransaction을 가져오거나 설정합니다. OleDbCommand command = new OleDbCommand(queryString, connection);
    command.CommandText = 
        "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?";
    command.Parameters.Add(parameters);
OleDbTransaction tran=connection.BeginTransaction();
command.Transaction=tran;

UpdateRowSource : OleDbDataAdapter 의 Update 메서드에 의해 사용될 때 명령 결과가 DataRow에 적용되는 방법을 가져오거나 설정합니다. 
 
public enum UpdateRowSource

None : 반환된 매개 변수와 행이 무시됩니다.
OutputParameters : 출력 매개 변수는 DataSet의 변경된 행에 매핑됩니다.
FirstReturnedRecord : 처음 반환된 행의 데이터는 DataSet의 변경된 행에 매핑됩니다.
Both : 출력 매개 변수와 처음 반환된 행은 모두 DataSet의 변경된 행에 매핑됩니다.

[OleDbCommand Public Methods]

Cancel : OleDbCommand의 수행 취소를 시도. 
 
public void CreateCommand(string queryString, OleDbConnection connection)
{
    OleDbCommand command = new OleDbCommand(queryString, connection);
    command.Connection.Open();
    command.ExecuteReader();
    command.Cancel();
}

Clone : 현재 인스턴스의 복사본인 새 OleDbCommand 개체를 만듭니다.
 
CreateParameter : OleDbParameter 개체의 새 인스턴스를 만듭니다. 
 
public void CreateCommand(string queryString, OleDbConnection connection)
{
    OleDbCommand command = new OleDbCommand(queryString, connection);
    command.Connection.Open();
OleDbParameter param= 
command.CreateParameter();
}
ExecuteNonQuery Connection 에 대해 SQL 문을 실행하고 영향 받는 행의 수를 반환합니다. static private void CreateOleDbCommand(
    string queryString, string connectionString)
{
    using (OleDbConnection connection = new 
               OleDbConnection(connectionString))
    {
        connection.Open();
        OleDbCommand command = new 
            OleDbCommand(queryString, connection);
        command.ExecuteNonQuery();
    }
}

ExecuteReader : CommandText 를 Connection에 보내고 OleDbDataReader를 빌드합니다. 
 
OleDbCommand cmd=new OleDbCommand();
public void CreateReader(string connectionString, string queryString)
{
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader[0].ToString());
        }
        reader.Close();
    }
}

OleDbConnection 을 닫기 전에 OleDbDataReader 개체를 먼저 닫습니다. OleDbCommand 개체를 다시 사용할 계획인 경우 OleDbDataReader 개체도 닫아야 합니다.
 
ExecuteReader(CommandBehavior) : CommandText 를 Connection에 보내고 CommandBehavior 값 중 하나를 사용하여 OleDbDataReader를 빌드합니다. 
 
public void CreateMyOleDbDataReader(string queryString,string connectionString) 
{
   OleDbConnection connection = new OleDbConnection(connectionString);
   OleDbCommand command = new OleDbCommand(queryString, connection);
   connection.Open();
   OleDbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
   while(reader.Read()) 
   {
      Console.WriteLine(reader.GetString(0));
   }
   reader.Close();
   //Implicitly closes the connection because CommandBehavior.CloseConnection was specified.
}
 
public enum CommandBehavior

Default : 쿼리는 여러 결과 집합을 반환할 수 있습니다. 쿼리를 실행하면 데이터베이스 상태에 영향을 미칠 수 있습니다. Default 는 CommandBehavior 플래그를 설정하지 않으므로 ExecuteReader(CommandBehavior.Default) 호출과 ExecuteReader() 호출은 기능적으로 동일합니다.
SingleResult : 쿼리는 단일 결과 집합을 반환합니다.
SchemaOnly : 쿼리에서 열 정보만 반환합니다. SchemaOnly 를 사용할 때 .NET Framework Data Provider for SQL Server에서는 실행되는 문 앞에 SET FMTONLY ON을 배치합니다.
KeyInfo : 쿼리는 열과 기본 키 정보를 반환
SingleRow : 쿼리가 첫 번째 결과 집합의 단일 행을 반환
CloseConnection : 명령을 실행하면 관련 Connection 개체는 관련 DataReader 개체가 닫힐 때 함께 닫힙니다.
 
ExecuteScalar : 쿼리를 실행하고 쿼리에서 반환된 결과 집합에서 첫 번째 행의 첫 번째 열을 반환합니다. 추가 열이나 행은 무시됩니다. 
 
CommandText = "SELECT COUNT(*) FROM region";
Int32 count = (int32) ExecuteScalar();

Prepare : 데이터 소스에 명령의 준비 버전이나 컴파일 버전을 만듭니다. (CommandType 이 StoredProcedure 혹은 Text로서 세팅 되어야만 작동. 열려진 커넥션(Connection) 객체가 커맨드(Command) 객체에 할 당 되어 있지 않으면, InvalidOperationException에러 발생. 
 
private static void OleDbCommandPrepare(string connectionString)
{
    using (OleDbConnection connection = new
               OleDbConnection(connectionString))
    {
        connection.Open();
        // Create the Command.
        OleDbCommand command = new OleDbCommand();
        // Set the Connection, CommandText and Parameters.
        command.Connection = connection;
        command.CommandText =
            "INSERT INTO dbo.Region (RegionID, RegionDescription) VALUES (?, ?)";
        command.Parameters.Add("RegionID", OleDbType.Integer, 4);
        command.Parameters.Add("RegionDescription", OleDbType.VarWChar, 50);
        command.Parameters[0].Value = 20;
        command.Parameters[1].Value = "First Region";
        // Call  Prepare and ExecuteNonQuery.
        command.Prepare();
        command.ExecuteNonQuery();
        // Change parameter values and call ExecuteNonQuery.
        command.Parameters[0].Value = 21;
        command.Parameters[1].Value = "SecondRegion";
        command.ExecuteNonQuery();
    }
}
 
ResetCommandTimeout :  CommandTimeout 프로퍼티를 디폴트(Default)인 30 sec. 로 복원. 
 
OleDbCommand cmd=new OleDbCommand();
cmd.CommandTimeout=90;

cmd.ResetCommandTimeout();