SqlDataReader vs SqlDataAdapter 

              연결 vs 비연결

 

 DB 종속적(sqlData~, oleData~)  vs DB 독립적(Dataset 앞에   sql 어쩌고가 없으니까..)

 

 SqlDataReader (매번 db 왓다갓다 해야되므로 속도가 저하된다.)

 

 질의(select *from tblAddress) 날릴때마다 db 왓다갓다 하면서 결과를 보여주는것.

 

 SqlDataAdapter (db 매번접근해야되는 횟수가 많으면 속도가 훨씬 빠르다. db 매번 접속하지 않으니까..더많이쓰임)

 

 fill 메서드가 호출되면 그이후에는 db 접속하지않는다. DataSet "select *from tblAddress" 결과가 복사되어있다.

 

이후부터는 DataSet 에서 가져와서 사용하는것이다.

 

 

 

string query = "select *from tblAddress";

// 1. 데이터 어댑터 생성

SqlDataAdapter adapter = new SqlDataAdapter(query, Properties.Resources.conStr);

            

// 2. 데이터 집합 생성 - 복사본

DataSet ds = new DataSet();

 

// 3. 데이터 채우기

adapter.Fill(ds, "tblAddress");

 

Console.WriteLine(ds.Tables["tblAddress"].Rows.Count);

 

// 4. 데이터 확인

DataTable dt = ds.Tables["tblAddress"];

for (int i = 0; i < dt.Rows.Count; i++)

 {

Console.WriteLine("{0}\t{1}\t{2}\t{3}", dt.Rows[i]["id"].ToString(),dt.Rows[i]["name"].ToString(),

dt.Rows[i]["email"].ToString(), dt.Rows[i]["age"].ToString());

 }

 


 

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

 

 

//질의가 두개 일때의 처리방법

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblTest1; select *from tblTest2;", con);

 

DataSet ds = new DataSet();

adapter.Fill(ds); // 질의가 두개일때는 임시테이블명 못준다.

            

 // 질의가 두개 일때는 아래와같이 테이블 이름을 준다...

ds.Tables[0].TableName = "tblTest1";

ds.Tables[1].TableName = "tblTest2";

 

Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

 {

for (int j = 0; j < ds.Tables[i].Rows.Count; j++)

{

Console.WriteLine("{0}\t{1}",ds.Tables[i].Rows[j]["seq"].ToString(), ds.Tables[i].Rows[j]["memo"].ToString());

}

}

 

// 테이블 1 추가

SqlDataAdapter adapter2 = new SqlDataAdapter("select *from tblAddress", con);

//DataSet ds2 = new DataSet();

 adapter2.Fill(ds, "tblAddress");

 

 Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

{

Console.WriteLine(ds.Tables[i].TableName);

 }


 

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

 

// 연결지향

// 리스트를 2 출력!

// 연결데이터를 안쓰는 가장큰이유.. 동일한데이터를 2번출력 없으므로..

 // 따라서 연결지향쓰는 경우는 한번만 훓어서 출력하고 싶을경우에 쓴다.

SqlConnection con = new SqlConnection(Properties.Resources.conStr);

 

SqlCommand cmd = new SqlCommand("select *from tblAddress", con);

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

            

// EOF 커서는 전진커서..뒤로 역탐색은 불가능하다.

while (reader.Read())

{

Console.WriteLine((int)reader["age"]+1);

// ★★ reader.GetInt32() : 캐스팅되서 나오는것. , 인덱스로만 접근가능하다.

Console.WriteLine(reader.GetInt32(3) + 1); 

Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 

 reader.Close();

reader = cmd.ExecuteReader();

 

while (reader.Read())

 {

 Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 con.Close(); // 읽은후에는 연결종료

 reader.Close(); // reader 종료

 

// 비연결

 // 2번출력해주는게 쉽다.빠르다. (DatasSet 들어있으니까..)

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblAddress", con);

DataSet ds = new DataSet();

adapter.Fill(ds, "tblAddress");

 

// 2 출력

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

{

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}

 Console.WriteLine();

 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 

 {

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}


by 피요히코~ 2009. 2. 25. 13:17